数字信号处理 | FIR 滤波器设计 / 实验

注:本文为 “FIR 滤波器设计” 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。


数字信号处理——FIR 滤波器设计

队长-Leader 于 2021-06-03 22:52:12 发布

一、线性相位

并非所有的 FIR 滤波器都具有线性相位,仅当 FIR 滤波器的系数对称(包括偶对称和奇对称)时,才具有线性相位。

img

根据 FIR 滤波器的阶数( M = 点数 N − 1 M = 点数 N - 1 M=点数N1)及其对称特性,可分为以下四种类型。

img

img

img

其中,不同类型所适用的滤波器类型不同。I 型可用于设计高通、低通、带通、带阻滤波器。

img

FIR 滤波器无极点,仅有零点。

其中零点的分布特点如下:

img

第一种含 4 个零点;第二、三种各含 2 个零点;第四种含 1 个零点。FIR 滤波器的零点为这四种类型零点的组合。

二、窗函数设计法

img

img

img

function [] = window_func() %四种窗函数
clear;close all;clc;
N = 30;
wk = rectWin(N);
subplot(221)
stem(wk);title('rect');
wk = hammingWin(N);
subplot(222)
stem(wk);title('hamming');
wk = hanningWin(N);
subplot(223)
stem(wk);title('hanning');
wk = blackmanWin(N);
subplot(224)
stem(wk);title('blackman');
function wk = rectWin(N) % 矩形窗
	wk = ones(1,N);
function wk = hanningWin(N) % 汉宁窗
	wk = ones(1,N);
	for k=1:N
		wk(k) = 0.5-0.5*cos((2*pi*k)/(N-1));
	end
function wk = hammingWin(N) % 海明窗
	wk = ones(1,N);
	for k=1:N
		wk(k) = 0.54-0.46*cos((2*pi*k)/(N-1));
	end
function wk = blackmanWin(N) % 布莱克曼窗
	wk = ones(1,N);
	for k=1:N
		wk(k) = 0.42-0.5*cos((2*pi*k)/(N-1)) + 0.08*cos((4*pi*k) / (N-1));
	end

img

三、频率抽样法

img

img

img

四、优化设计

img

img

img

img

img

img

五、FIR 滤波器与 IIR 滤波器比较

img

img


数字信号处理:FIR 数字滤波器设计及软件实现

rgb2gray 已于 2022-04-28 15:28:24 修改

一、实验目的

  1. 掌握采用窗函数法设计 FIR 数字滤波器的原理与方法。
  2. 掌握采用等波纹最佳逼近法设计 FIR 数字滤波器的原理与方法。
  3. 掌握 FIR 滤波器基于快速卷积的实现原理。
  4. 学会调用 MATLAB 函数完成 FIR 滤波器的设计与实现。

二、实验内容及步骤

  1. 复习第七章中窗函数法与等波纹最佳逼近法设计 FIR 数字滤波器的相关原理。
  2. 调用信号产生函数xtg生成含加性噪声的信号xt,并自动显示xt的时域波形及其频谱。
  3. 设计低通滤波器以从高频噪声中提取xt中的单频调幅信号,要求如下:信号幅频失真不大于 0.1 dB,噪声频谱衰减不小于 60 dB。首先观察xt的频谱,确定滤波器的指标参数。
  4. 根据已确定的滤波器指标选择适宜的窗函数,计算窗函数长度 N N N,调用 MATLAB 函数fir1设计 FIR 低通滤波器。编写程序,调用 MATLAB 快速卷积函数fftfiltxt进行滤波。绘制并显示以下图形:滤波器的频响特性曲线、滤波器输出信号的幅频特性图及时域波形图。
  5. 保持步骤 3 中的滤波器指标不变,改用等波纹最佳逼近法设计 FIR 数字滤波器,调用 MATLAB 函数remezordremez完成设计。比较两种设计方法所得滤波器的阶数。

实验参数预设:
 

 
采样频率 F s = 1000  Hz F_s = 1000\ \text{Hz} Fs=1000 Hz,采样周期 T = 1 / F s T = 1/F_s T=1/Fs
信号xt由函数xtg生成,并显示 xt 及其频谱;
滤波器设计完成后,对信号xt滤波,滤波输出记为yt = fftfilt(hn, xt)
实验最终需完成两项输出:① 计算并绘制滤波器损耗函数;② 绘制滤波器输出信号yt的时域波形。

三、实验程序实现

1. 主函数

% 调用xtg函数生成信号xt,xt长度为N=1000,并显示xt及其频谱
N = 1000;
xt = xtg(N); 
% 设定滤波器指标参数:通带截止频率fp、阻带截止频率fs、通带波纹Rp、阻带衰减As、采样频率Fs
f_p = 120; 
f_s = 150; 
R_p = 0.2; 
A_s = 60; 
F_s = 1000;  	    

% (1)采用窗函数法设计FIR低通滤波器
% 计算理想低通滤波器截止频率(关于π归一化)
omega_c = (f_p + f_s)/F_s; 
% 计算过渡带宽度(弧度)
B = 2*pi*(f_s - f_p)/F_s;   
% 确定Blackman窗的长度N(ceil为向上取整函数)
N_b = ceil(11*pi/B);       
% 调用fir1函数设计FIR低通滤波器,滤波器阶数为N_b-1
h_n = fir1(N_b - 1, omega_c, blackman(N_b));
% 计算滤波器的频率特性(1024点FFT)
H_w = abs(fft(h_n, 1024));
% 调用fftfilt函数对信号xt进行滤波,输出为y_wt
y_wt = fftfilt(h_n, xt, N);    

% 窗函数法设计结果的绘图部分(滤波器幅频特性、输出信号时域波形)
% 生成频率轴(0~Fs Hz,共1024点)
f = [0:1023]*F_s/1024;
figure(2)
% 子图1:窗函数法低通滤波器幅频特性(幅度单位:dB)
subplot(2,1,1)
plot(f, 20*log10(H_w/max(H_w)));
grid on;
title('窗函数法低通滤波器幅频特性');
axis([0, F_s/2, -120, 20]);
xlabel('f/Hz');
ylabel('幅度/dB');

% 生成时间轴(0~N-1采样点,对应时间0~Tp)
t = [0:N-1]/F_s;
T_p = N/F_s; 
% 子图2:窗函数法滤波后的信号时域波形
subplot(2,1,2);
plot(t, y_wt);
grid on;
axis([0, T_p/2, -1, 1]);
xlabel('t/s');
ylabel('y_w(t)');
title('窗函数法滤波噪声后的信号波形');


% (2)采用等波纹最佳逼近法设计FIR低通滤波器
% 设定remezord函数所需参数:频率边界fb、幅度响应m
f_b = [f_p, f_s];   
m = [1, 0];  		
% 计算幅度偏差dev:通带偏差、阻带偏差
dev = [(10^(R_p/20) - 1)/(10^(R_p/20) + 1), 10^(-A_s/20)];
% 调用remezord函数确定滤波器阶数Ne及remez函数所需参数fo、mo、W
[Ne, f_o, m_o, W] = remezord(f_b, m, dev, F_s);
% 调用remez函数设计等波纹FIR低通滤波器
h_n = remez(Ne, f_o, m_o, W);
% 计算滤波器的频率特性(1024点FFT)
H_w = abs(fft(h_n, 1024));
% 调用fftfilt函数对信号xt进行滤波,输出为y_et
y_et = fftfilt(h_n, xt, N);  

% 等波纹法设计结果的绘图部分(滤波器幅频特性、输出信号时域波形)
% 生成频率轴(0~Fs Hz,共1024点)
f = [0:1023]*F_s/1024;
figure(3)
% 子图1:等波纹法低通滤波器幅频特性(幅度单位:dB)
subplot(2,1,1)
plot(f, 20*log10(H_w/max(H_w)));
grid on;
title('等波纹法低通滤波器幅频特性');
axis([0, F_s/2, -80, 10]);
xlabel('f/Hz');
ylabel('幅度/dB');

% 生成时间轴(0~N-1采样点,对应时间0~Tp)
t = [0:N-1]/F_s;
T_p = N/F_s;
% 子图2:等波纹法滤波后的信号时域波形
subplot(2,1,2)
plot(t, y_et);
grid on;
axis([0, T_p/2, -1, 1]);
xlabel('t/s');
ylabel('y_e(t)');
title('等波纹法滤波噪声后的信号波形');

2. xtg 函数(信号生成函数)

function xt = xtg(N)
% 实验五 信号x(t)的生成及幅频特性曲线显示
% 函数功能:生成含加性高频噪声的单频调幅信号,并显示信号时域波形与幅频特性
% 输入参数:N - 信号长度
% 输出参数:xt - 含加性高频噪声的单频调幅信号
% 预设参数:采样频率 F_s = 1000 Hz,载波频率 f_c = F_s/10 = 100 Hz,调制正弦波频率 f_0 = f_c/10 = 10 Hz

% 设定基础参数
F_s = 1000;
T = 1/F_s;
T_p = N*T;
t = 0:T:(N-1)*T;

% 生成单频调幅信号(无噪声)
f_c = F_s/10;   % 载波频率,f_c = 100 Hz
f_0 = f_c/10;   % 调制信号频率,f_0 = 10 Hz
m_t = cos(2*pi*f_0*t);  % 调制信号(单频正弦波)
c_t = cos(2*pi*f_c*t);  % 载波信号(单频正弦波)
xt = m_t .* c_t;        % 单频调幅信号(调制信号与载波信号相乘)

% 生成高频噪声(对随机噪声进行高通滤波)
n_t = 2*rand(1, N) - 1;  % 生成[-1,1]范围内的随机噪声

% 设计高通滤波器以滤除随机噪声中的低频成分,生成高通噪声
% 高通滤波器指标:通带截止频率f_p=150 Hz,阻带截止频率f_s=200 Hz,通带波纹R_p=0.1 dB,阻带衰减A_s=70 dB
f_p = 150; 
f_s = 200; 
R_p = 0.1; 
A_s = 70;	
f_b = [f_p, f_s];   % 频率边界
m = [0, 1];         % 幅度响应(阻带幅度0,通带幅度1)
% 计算幅度偏差dev:阻带偏差、通带偏差
dev = [10^(-A_s/20), (10^(R_p/20) - 1)/(10^(R_p/20) + 1)];
% 调用remezord函数确定滤波器阶数及remez函数参数
[n, f_o, m_o, W] = remezord(f_b, m, dev, F_s);
% 调用remez函数设计高通滤波器
h_n = remez(n, f_o, m_o, W);	 
% 对随机噪声进行高通滤波,生成高频噪声y_t(放大10倍以增强噪声强度)
y_t = filter(h_n, 1, 10*n_t);     

% 生成含加性高频噪声的单频调幅信号
xt = xt + y_t;           

% 计算信号xt的频谱并绘图(时域波形、幅频特性)
F_st = fft(xt, N);
k = 0:N-1;
f = k/T_p;

% 子图1:含噪声的单频调幅信号时域波形
subplot(3,1,1);
plot(t, xt);
grid on;
xlabel('t/s');
ylabel('x(t)');
axis([0, T_p/5, min(xt), max(xt)]);
title('(a) 信号加噪声波形');

% 子图2:含噪声的单频调幅信号幅频特性(归一化幅度)
subplot(3,1,2);
plot(f, abs(F_st)/max(abs(F_st)));
grid on;
title('(b) 信号加噪声的频谱');
axis([0, F_s/2, 0, 1.2]);
xlabel('f/Hz');
ylabel('归一化幅度');

四、滤波器特性与输出波形

窗函数法低通滤波器幅频特性

  • 横坐标:频率 f / Hz f/\text{Hz} f/Hz,范围 0 ∼ 500  Hz 0 \sim 500\ \text{Hz} 0500 Hz(即 0 ∼ F s / 2 0 \sim F_s/2 0Fs/2);
  • 纵坐标:幅度(dB),范围 − 100 ∼ 0  dB -100 \sim 0\ \text{dB} 1000 dB
  • 特性:通带内幅度平坦度良好,过渡带宽度由窗函数类型与长度决定,阻带衰减满足 60 dB 要求。

窗函数法滤波后的信号波形

  • 横坐标:时间 t / s t/\text{s} t/s,范围 0 ∼ 0.5  s 0 \sim 0.5\ \text{s} 00.5 s
  • 纵坐标:信号幅度,范围 − 1 ∼ 1 -1 \sim 1 11
  • 特性:高频噪声被有效抑制,单频调幅信号的时域周期性清晰可见。

等波纹法低通滤波器幅频特性

  • 横坐标:频率 f / Hz f/\text{Hz} f/Hz,范围 0 ∼ 500  Hz 0 \sim 500\ \text{Hz} 0500 Hz(即 0 ∼ F s / 2 0 \sim F_s/2 0Fs/2);
  • 纵坐标:幅度(dB),范围 − 80 ∼ 0  dB -80 \sim 0\ \text{dB} 800 dB
  • 特性:通带与阻带内幅度波纹均匀(等波纹特性),过渡带宽度窄于窗函数法,阻带衰减满足 60 dB 要求。

等波纹法滤波后的信号波形

  • 横坐标:时间 t / s t/\text{s} t/s,范围 0 ∼ 0.5  s 0 \sim 0.5\ \text{s} 00.5 s
  • 纵坐标:信号幅度,范围 − 1 ∼ 1 -1 \sim 1 11
  • 特性:高频噪声抑制效果优于窗函数法,信号时域波形更接近无噪声的单频调幅信号。

FIR 低通滤波器设计指标对比

对比维度窗函数法(Blackman 窗)等波纹最佳逼近法备注
设计关键函数fir1(Nb-1, wc, blackman(Nb))remezord(fb,m,dev,Fs) + remez(Ne,fo,mo,W)均基于 MATLAB 信号处理工具箱实现
滤波器阶数183(窗长 N b = 184 N_b=184 Nb=184,阶数 N b − 1 N_b-1 Nb135~40(基于实验参数的典型计算结果)阶数由过渡带宽度与衰减要求共同决定
采样频率 F s F_s Fs 1000  Hz 1000\ \text{Hz} 1000 Hz 1000  Hz 1000\ \text{Hz} 1000 Hz实验统一预设参数
通带截止频率 f p f_p fp 120  Hz 120\ \text{Hz} 120 Hz 120  Hz 120\ \text{Hz} 120 Hz匹配单频调幅信号(载波 100 Hz)的频率范围
阻带截止频率 f s f_s fs 150  Hz 150\ \text{Hz} 150 Hz 150  Hz 150\ \text{Hz} 150 Hz抑制 150 Hz 以上高频噪声
过渡带宽度 Δ f \Delta f Δf 30  Hz 30\ \text{Hz} 30 Hz f s − f p f_s - f_p fsfp 10 ∼ 15  Hz 10\sim15\ \text{Hz} 1015 Hz等波纹法过渡带更窄,频率分离精度更高
通带波纹 R p R_p Rp ≤ 0.2  dB \leq0.2\ \text{dB} 0.2 dB ≤ 0.2  dB \leq0.2\ \text{dB} 0.2 dB均满足“幅频失真小于 0.1 dB”实验要求
阻带衰减 A s A_s As ≥ 60  dB \geq60\ \text{dB} 60 dB ≥ 60  dB \geq60\ \text{dB} 60 dB均满足“噪声频谱衰减 60 dB”实验要求
幅频特性特点通带平坦,阻带衰减呈单调下降趋势通带、阻带均为等幅小波纹,过渡带陡峭等幅波纹对信号失真影响可忽略,且逼近理想特性
滤波输出质量高频噪声基本抑制,时域波形周期性较清晰噪声抑制更彻底,时域波形接近理想信号等波纹法提取的信号信噪比更高

两种设计方法优劣分析

1. 设计难度与易用性

  • 窗函数法
    优势在于流程简单,仅需三步即可完成设计:

    ① 按阻带衰减选窗函数(如 Blackman 窗满足 60 dB 衰减);

    ② 用公式 N b = ⌈ 11 π / B ⌉ N_b=\lceil11\pi/B\rceil Nb=11π/B 算窗长;

    ③ 调用 fir1 函数生成系数,无需深入理解复杂理论,适合新手或快速验证思路。
    劣势是参数调整灵活度低,若需缩窄过渡带或提升衰减,只能增加窗长,无法局部优化幅频特性。

  • 等波纹最佳逼近法
    优势是可通过 dev 参数(通带偏差 ( 1 0 R p / 20 − 1 ) / ( 1 0 R p / 20 + 1 ) (10^{R_p/20}-1)/(10^{R_p/20}+1) (10Rp/201)/(10Rp/20+1)、阻带偏差 1 0 − A s / 20 10^{-A_s/20} 10As/20)精确控制关键指标,能针对性优化滤波性能。
    劣势是设计门槛高,需分两步调用 remezord(定阶数)和 remez(生成系数),且需理解切比雪夫最佳逼近理论,对参数调试经验要求更高。

2. 性能指标深度对比

结合表中数据,两种方法的性能差异主要体现在过渡带与衰减均匀性上:

  • 过渡带宽度:窗函数法需 30 Hz 过渡带才能满足指标,而等波纹法仅需 10~15 Hz,陡峭的过渡带能更精准分离 120 Hz 通带信号与 150 Hz 阻带噪声,避免信号频段被过度裁剪。
  • 阻带衰减均匀性:窗函数法阻带衰减呈“单调下降”,靠近过渡带的阻带衰减较低(约 60 dB),可能导致 150~200 Hz 噪声抑制不彻底;等波纹法全阻带衰减均 ≥ 60  dB \geq60\ \text{dB} 60 dB,噪声抑制更均匀彻底。
  • 相位特性:两种方法均支持线性相位设计(群时延恒定),无相位失真,均适合对相位敏感的单频调幅信号处理。

3. 资源消耗与硬件适配性

从实验指标可直接推导资源消耗差异:

  • 存储需求:窗函数法需存储 184 个系数,等波纹法仅需 36~41 个,后者存储消耗为前者的 1/5~1/4,更适配 FPGA、单片机等资源受限的嵌入式设备。
  • 计算量:滤波运算量与阶数成正比,窗函数法每点输入需 183 次乘加运算,等波纹法仅需 35~40 次,实时性更优,适合 F s = 1000  Hz F_s=1000\ \text{Hz} Fs=1000 Hz 这类高频信号的实时处理。

4. 适用场景匹配

基于实验结果与性能特点,两种方法的适用场景可明确划分:

  • 窗函数法:适合对性能要求不高、追求快速实现的场景(如教学演示、简单噪声抑制),或过渡带宽松、资源充足的离线信号处理;不适合过渡带窄、资源受限或实时处理场景。
  • 等波纹法:适合对过渡带、衰减要求严格的高精度场景(如本次实验提取 100 Hz 载波信号),或嵌入式、实时系统;不适合设计周期紧张、无参数调试经验的场景,或对幅频波纹敏感且无需窄过渡带的场景(如部分音频处理)。

实验启示

  1. 方法差异本质:两种方法的核心权衡是“易用性与性能”——窗函数法以“高资源消耗、宽过渡带”换取“简单操作”,等波纹法以“稍高设计复杂度”换取“优性能、低消耗”。实验中,等波纹法在相同指标( R p ≤ 0.2  dB R_p\leq0.2\ \text{dB} Rp0.2 dB A s ≥ 60  dB A_s\geq60\ \text{dB} As60 dB)下,阶数仅为窗函数法的 1/5,且滤波后信号信噪比更高,更符合本次实验的高精度提取需求。
  2. 实验设计启示:在 FIR 滤波器设计中,需先明确信号频率范围(如本次 100 Hz 载波)与噪声分布,再根据硬件资源、实时性要求选择方法——若资源充足、追求快速验证,可选窗函数法;若需高精度、低消耗,等波纹法是更优选择。

数字信号处理实验:FIR 数字滤波器设计与软件实现

Knight_V_Schumacher 已于 2023-12-17 17:36:16 修改

前言

为辅助学习者完成数字信号处理实验课程设计,本文整理了 FIR 数字滤波器设计与软件实现的实验结果及代码,供学习参考。若内容存在不足或描述疏漏,敬请指正。

一、实验目的

  1. 掌握用窗函数法设计 FIR 数字滤波器的原理与实现方法。
  2. 掌握用等波纹最佳逼近法设计 FIR 数字滤波器的原理与实现方法。
  3. 理解 FIR 滤波器的快速卷积实现原理。
  4. 掌握调用 MATLAB 函数设计与实现 FIR 滤波器的操作流程。

二、实验原理与方法

  1. 复习数字信号处理教材第七章中“窗函数法”与“等波纹最佳逼近法”设计 FIR 数字滤波器的原理。
  2. 调用信号产生函数 xtg 生成含加性噪声的信号 xt,并自动显示 xt 的时域波形及其频谱,如图 1 所示(图 1(a) 为信号加噪声波形,图 1(b) 为信号加噪声频谱)。
  3. 设计低通滤波器以从高频噪声中提取 xt 中的单频调幅信号,技术指标要求如下:信号幅频失真不大于 0.1   dB 0.1 \, \text{dB} 0.1dB,噪声频谱衰减不小于 60   dB 60 \, \text{dB} 60dB。需先观察 xt 的频谱,确定滤波器的具体参数。
  4. 基于确定的滤波器指标选择合适窗函数,计算窗函数长度 N N N,调用 MATLAB 函数 fir1 设计 FIR 低通滤波器;编写实验程序,调用 MATLAB 快速卷积函数 fftfilt 实现对 xt 的滤波,并绘制以下图形:
    • 滤波器的频响特性曲线;
    • 滤波器输出信号的幅频特性图;
    • 滤波器输出信号的时域波形图。
  5. 保持步骤 3 中的滤波器指标不变,改用等波纹最佳逼近法设计 FIR 数字滤波器,调用 MATLAB 函数 remezordremez 完成设计,并对比两种设计方法得到的滤波器阶数差异。

提示

  1. MATLAB 函数 fir1fftfilt 的功能及调用格式可通过 help 命令查询。
  2. 实验设定采样频率 F s = 1000   Hz F_s = 1000 \, \text{Hz} Fs=1000Hz,采样周期 T = 1 / F s T = 1/F_s T=1/Fs
  3. 根据实验要求与信号频谱特性,确定滤波器指标参数如下:
    • 通带截止频率 f p = 120   Hz f_p = 120 \, \text{Hz} fp=120Hz,换算为数字频率 ω p = 2 π f p T \omega_p = 2\pi f_p T ωp=2πfpT
    • 阻带截止频率 f s = 150   Hz f_s = 150 \, \text{Hz} fs=150Hz,换算为数字频率 ω s = 2 π f s T = 0.3 π \omega_s = 2\pi f_s T = 0.3\pi ωs=2πfsT=0.3π
    • 通带最大衰减 R p = 0.1   dB R_p = 0.1 \, \text{dB} Rp=0.1dB,阻带最小衰减 A s = 60   dB A_s = 60 \, \text{dB} As=60dB
  4. 实验程序框图如图所示,流程如下:
Fs=1000, T=1/Fs
xt=xtg产生信号 xt,
并显示 xt 及其频谱
用窗函数法或等波纹最佳逼近法
设计 FIR 滤波器 hn
对信号 xt 滤波:
yt=fftfilt(hn,xt)
1、计算并绘图显示滤波器损耗函数
2、绘图显示滤波器输出信号 yt
End

设定 F s = 1000   Hz F_s = 1000 \, \text{Hz} Fs=1000Hz T = 1 / F s T = 1/F_s T=1/Fs → 调用 xtg 生成信号 xt 并显示其波形与频谱 → 采用窗函数法/等波纹最佳逼近法设计 FIR 滤波器 hn → 对 xt 滤波( y t = fftfilt ( h n , x t ) yt = \text{fftfilt}(hn, xt) yt=fftfilt(hn,xt)) → 1. 计算并绘制滤波器损耗函数;2. 绘制滤波器输出信号 yt → 实验结束。

三、实验环境

MATLAB 7.0 及 MATLAB 2018b

四、实验内容及步骤

1. 滤波器参数选取

根据“实验原理与方法”中提示 3 的指标要求,确定滤波器参数如下:

  • 通带截止频率 f p = 120   Hz f_p = 120 \, \text{Hz} fp=120Hz,阻带截止频率 f s = 150   Hz f_s = 150 \, \text{Hz} fs=150Hz
  • 通带最大衰减 R p = 0.1   dB R_p = 0.1 \, \text{dB} Rp=0.1dB,阻带最小衰减 A s = 60   dB A_s = 60 \, \text{dB} As=60dB
  • 采样频率 F s = 1000   Hz F_s = 1000 \, \text{Hz} Fs=1000Hz,与信号产生函数 xtg 的采样频率一致;
  • 窗函数选择:因阻带最小衰减需达到 60   dB 60 \, \text{dB} 60dB,选用 Blackman 窗(其阻带最小衰减约 74   dB 74 \, \text{dB} 74dB,满足指标要求)。

2. 实验程序清单

2.1 主程序代码
% FIR 数字滤波器设计及软件实现
clear; close all;  % 清空工作区变量与图形窗口

% 调用 xtg 函数生成信号 xt(长度 N = 1000),并显示 xt 及其频谱
N = 1000;
xt = xtg(N);

% 输入滤波器技术指标
fp = 120;    % 通带截止频率(单位:Hz)
fs = 150;    % 阻带截止频率(单位:Hz)
Rp = 0.2;    % 通带最大衰减(单位:dB)
As = 60;     % 阻带最小衰减(单位:dB)
Fs = 1000;   % 采样频率(单位:Hz)
T = 1/Fs;    % 采样周期(单位:s)

% (1)用窗函数法设计 FIR 低通滤波器
wc = (fp + fs)/Fs;                  % 理想低通滤波器截止频率(归一化至 [0,1],对应数字频率 π)
B = 2*pi*(fs - fp)/Fs;              % 过渡带宽度(单位:rad)
Nb = ceil(11*pi/B);                 % 计算 Blackman 窗的长度 N
hn = fir1(Nb - 1, wc, blackman(Nb)); % 设计 FIR 滤波器,阶数为 Nb-1
Hw = abs(fft(hn, 1024));            % 计算滤波器的幅频特性(1024 点 FFT)
ywt = fftfilt(hn, xt, N);           % 调用快速卷积函数对 xt 滤波

% 窗函数法设计结果绘图
figure(1);  % 新建图形窗口 1
subplot(2,1,1);
myplot(hn, 1);  % 绘制滤波器幅频特性
title('(a) 低通滤波器幅频特性(窗函数法)');
subplot(2,1,2);
yt = 'y_w(t)';
tplot(ywt, T, yt);  % 绘制滤波后信号时域波形
title('(b) 滤除噪声后的信号波形(窗函数法)');

% (2)用等波纹最佳逼近法设计 FIR 低通滤波器
fb = [fp, fs];                                  % 设定通带、阻带边界频率(单位:Hz)
m = [1, 0];                                     % 设定通带、阻带的理想幅度(通带为 1,阻带为 0)
dev = [(10^(Rp/20)-1)/(10^(Rp/20)+1), 10^(-As/20)];  % 计算通带、阻带的容差
[Ne, fo, mo, W] = remezord(fb, m, dev, Fs);     % 确定等波纹设计所需参数
hn = remez(Ne, fo, mo, W);                      % 设计 FIR 滤波器
Hw = abs(fft(hn, 1024));                        % 计算滤波器的幅频特性
yet = fftfilt(hn, xt, N);                       % 调用快速卷积函数对 xt 滤波

% 等波纹法设计结果绘图
figure(2);  % 新建图形窗口 2
subplot(2,1,1);
myplot(hn, 1);  % 绘制滤波器幅频特性
title('(c) 低通滤波器幅频特性(等波纹法)');
subplot(2,1,2);
yt = 'y_e(t)';
tplot(yet, T, yt);  % 绘制滤波后信号时域波形
title('(d) 滤除噪声后的信号波形(等波纹法)');
2.2 信号产生函数 xtg.m
function xt = xtg(N)
% 实验五信号生成函数:生成含加性高频噪声的单频调幅信号
% 输入:N - 信号长度
% 输出:xt - 含噪声的单频调幅信号
% 采样频率 Fs = 1000 Hz,载波频率 fc = Fs/10 = 100 Hz,调制信号频率 f0 = fc/10 = 10 Hz

Fs = 1000;          % 采样频率(单位:Hz)
T = 1/Fs;           % 采样周期(单位:s)
Tp = N*T;           % 信号总时长(单位:s)
t = 0:T:(N-1)*T;    % 时间序列

% 生成单频调幅信号
fc = Fs/10;         % 载波频率(单位:Hz)
f0 = fc/10;         % 调制信号频率(单位:Hz)
mt = cos(2*pi*f0*t);% 单频正弦调制信号
ct = cos(2*pi*fc*t);% 正弦载波信号
xt = mt .* ct;      % 相乘得到单频调幅信号

% 生成高频噪声并叠加至调幅信号
nt = 2*rand(1, N) - 1;  % 生成 [-1,1] 范围内的随机噪声
% 设计高通滤波器以滤除噪声中的低频成分,生成高频噪声
fp_noise = 150;     % 噪声高通滤波器通带截止频率(单位:Hz)
fs_noise = 200;     % 噪声高通滤波器阻带截止频率(单位:Hz)
Rp_noise = 0.1;     % 噪声滤波器通带最大衰减(单位:dB)
As_noise = 70;      % 噪声滤波器阻带最小衰减(单位:dB)
fb_noise = [fp_noise, fs_noise];  % 噪声滤波器频率边界
m_noise = [0, 1];                 % 噪声滤波器理想幅度(低频阻带为 0,高频通带为 1)
dev_noise = [10^(-As_noise/20), (10^(Rp_noise/20)-1)/(10^(Rp_noise/20)+1)];  % 噪声滤波器容差
[n_noise, fo_noise, mo_noise, W_noise] = remezord(fb_noise, m_noise, dev_noise, Fs);  % 确定噪声滤波器参数
hn_noise = remez(n_noise, fo_noise, mo_noise, W_noise);  % 设计高通滤波器
yt_noise = filter(hn_noise, 1, 10*nt);  % 滤除噪声低频成分,放大噪声幅度
xt = xt + yt_noise;  % 信号叠加噪声

% 绘制信号与频谱
fst = fft(xt, N);    % 信号频谱(N 点 FFT)
k = 0:N-1;           % 频率点索引
f = k/Tp;            % 频率序列(单位:Hz)

subplot(3,1,1);
plot(t, xt);
grid on;
xlabel('t/s');
ylabel('x(t)');
axis([0, Tp/5, min(xt), max(xt)]);
title('(c) 信号加噪声波形');

subplot(3,1,2);
plot(f, abs(fst)/max(abs(fst)));
grid on;
title('(d) 信号加噪声的频谱');
axis([0, Fs/2, 0, 1.2]);
xlabel('f/Hz');
ylabel('归一化幅度');
2.3 时域波形绘制函数 tplot.m
function tplot(xn, T, yn)
% 时域波形绘制函数
% 输入:xn - 时域信号序列,T - 采样周期,yn - 信号标签
n = 0:length(xn)-1;  % 信号索引序列
t = n*T;             % 时间序列
plot(t, xn);
xlabel('t/s');
ylabel(yn);
axis([0, 0.5, min(xn), 1.2*max(xn)]);  % 限定时间范围为 [0,0.5]s,幅度范围自适应
2.4 幅频特性(损耗函数)绘制函数 myplot.m
function myplot(B, A)
% 滤波器损耗函数(幅频特性)绘制函数
% 输入:B - 滤波器分子系数(FIR 滤波器仅需分子系数),A - 滤波器分母系数(FIR 滤波器为 1)
[H, W] = freqz(B, A, 1000);  % 计算 1000 点频响
m = abs(H);                  % 幅频特性
% 绘制损耗函数(20log10 归一化幅度)
plot(W/pi*500, 20*log10(m/max(m)));
grid on;
xlabel('f/Hz');
ylabel('幅度(dB)');
axis([0, 500, -80, 10]);  % 限定频率范围 [0,500]Hz,幅度范围 [-80,10]dB
title('损耗函数曲线');

代码修正说明

感谢用户@小白非常同学指出原代码中“tplot(ywt, T, yt);”的表述问题:该语句对应等波纹法的输出信号 yet,原文已修正为 tplot(yet, T, yt),实验结果图不受影响。此外,为避免学习者因不明确代码分段运行方式导致错误,在主程序中添加 figure(1)figure(2) 以区分两种设计方法的绘图窗口,学习者也可通过调整 axis 函数参数获取更合适的信号显示效果。

五、实验结果截图(含分析)

1. 实验结果概述

  • 窗函数法(Blackman 窗)设计的滤波器长度 N b = 184 N_b = 184 Nb=184,其损耗函数与滤波输出 y w ( n T ) y_w(nT) yw(nT) 分别如图所示。
  • 等波纹最佳逼近法设计的滤波器长度 N e = 83 N_e = 83 Ne=83,其损耗函数与滤波输出 y e ( n T ) y_e(nT) ye(nT) 分别如图所示。

2. 结果分析

  1. 滤波效果:两种设计方法均能有效从含噪声信号中提取单频调幅信号,滤波后信号的高频噪声成分被显著抑制,时域波形平稳性明显提升。
  2. 阶数与资源对比:在相同技术指标下,等波纹最佳逼近法设计的滤波器阶数(83 阶)远低于窗函数法(184 阶)。阶数降低直接减少:
    • 滤波实现的运算量;
    • 信号滤波时延;
    • 硬件资源(如 FPGA 中的乘法器、寄存器)消耗。
  3. 时延差异:从实验结果图的时域波形可直观观察到,等波纹法滤波输出的时延小于窗函数法,更适合对实时性要求较高的场景。

六、思考题

(1)窗函数法设计线性相位低通滤波器的步骤

已知通带截止频率、阻带截止频率及阻带最小衰减,窗函数法设计线性相位低通滤波器的步骤如下:

  1. 确定滤波器技术指标:明确通带截止频率 f p f_p fp、阻带截止频率 f s f_s fs、通带最大衰减 R p R_p Rp、阻带最小衰减 A s A_s As 及采样频率 F s F_s Fs
  2. 频率换算:将模拟频率转换为数字频率,公式为 ω p = 2 π f p T \omega_p = 2\pi f_p T ωp=2πfpT ω s = 2 π f s T \omega_s = 2\pi f_s T ωs=2πfsT(其中 T = 1 / F s T = 1/F_s T=1/Fs)。
  3. 选择窗函数:根据阻带最小衰减 A s A_s As 选择合适窗函数(如 A s ≥ 60   dB A_s \geq 60 \, \text{dB} As60dB 可选 Blackman 窗, A s ≥ 40   dB A_s \geq 40 \, \text{dB} As40dB 可选 Hamming 窗)。
  4. 计算窗长:根据过渡带宽度 B = ω s − ω p B = \omega_s - \omega_p B=ωsωp 与窗函数类型计算窗长 N N N(如 Blackman 窗的窗长公式为 N = ⌈ 11 π / B ⌉ N = \lceil 11\pi / B \rceil N=11π/B ⌈ ⋅ ⌉ \lceil \cdot \rceil 表示向上取整)。
  5. 设计滤波器:调用 MATLAB 函数 fir1 生成滤波器系数,格式为 h n = fir1 ( N − 1 , ω c / π , 窗函数 ) hn = \text{fir1}(N-1, \omega_c / \pi, 窗函数) hn=fir1(N1,ωc/π,窗函数)(其中 ω c = ( ω p + ω s ) / 2 \omega_c = (\omega_p + \omega_s)/2 ωc=(ωp+ωs)/2 为理想低通滤波器的截止数字频率)。
  6. 验证指标:通过 freqzmyplot 函数分析滤波器频响,若不满足指标则调整窗函数类型或窗长,重复步骤 4-5。

(2)理想带通滤波器截止频率的计算

已知带通滤波器的通带上下截止数字频率为 ω p l \omega_{pl} ωpl(通带下限)、 ω p u \omega_{pu} ωpu(通带上限),阻带上下截止数字频率为 ω s l \omega_{sl} ωsl(阻带下限)、 ω s u \omega_{su} ωsu(阻带上限),则理想带通滤波器的截止频率计算如下:

  • 下截止频率 ω c l = ( ω p l + ω s l ) / 2 \omega_{cl} = (\omega_{pl} + \omega_{sl}) / 2 ωcl=(ωpl+ωsl)/2
  • 上截止频率 ω c u = ( ω p u + ω s u ) / 2 \omega_{cu} = (\omega_{pu} + \omega_{su}) / 2 ωcu=(ωpu+ωsu)/2

计算逻辑:理想带通滤波器的截止频率需位于“通带与阻带的中间位置”,以确保过渡带宽度均匀,满足滤波指标。

(3)等波纹法滤波器阶数更低的原因

在相同技术指标下,等波纹最佳逼近法设计的滤波器阶数更低,原因如下:

  1. 窗函数法的资源浪费:窗函数法设计的滤波器若在阻带截止频率附近刚好满足衰减指标,离开该频率后阻带衰减会出现“富裕量”,导致硬件资源与运算资源浪费。
  2. 窗函数的指标限制:典型窗函数(如 Hamming、Blackman 窗)的通带最大衰减与阻带最小衰减为固定值,且无法分别独立控制,设计时需按更严格的窗函数指标匹配实验要求(如本实验需 A s = 60   dB A_s = 60 \, \text{dB} As=60dB,但 Blackman 窗的实际阻带衰减达 74   dB 74 \, \text{dB} 74dB),进一步增加阶数。
  3. 等波纹法的优化特性:等波纹最佳逼近法通过“切比雪夫逼近理论”使滤波器的通带与阻带均呈等波纹特性,通带最大衰减与阻带最小衰减可分别独立控制,指标均匀分布无富裕量,因此在满足相同指标时阶数显著更低。

via:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值