一、实验目的
1
、加深对窗函数法设计
FIR
数字滤波器的基本原理的理解。
2
、学习用
Matlab
语言的窗函数法编写设计
FIR
数字滤波器的程序。
3
、了解
Matlab
语言有关窗函数法设计
FIR
数字滤波器的常用函数用法。
4
、掌握
FIR
滤波器的快速卷积实现原理。
5
、不同滤波器的设计方法具有不同的优缺点,因此要全面、客观看待可能
面对或出现的问题。
二、实验任务
1、阅读并输入实验原理中介绍的例题程序,观察输出的数据和图形,结合基本原理理解每一条语句的含义。
2、选择合适的窗函数设计 FIR 数字低通滤波器
要求:ωp=0.24 ,Rp=0.1dB; ωs=0.3 ,As=60dB。描绘该滤波器的脉冲响应、窗函数及滤波器的幅频响应曲线和相频响应曲线。
3、调用信号产生函数 xtg 产生具有加性噪声的信号 x(t),并显示信号及其频谱。
程序清单如下:
[xt,t]=xtg(1000);
程序运行结果如下:
4、采用实验内容步骤 2 中设计的 FIR 数字低通滤波器,调用 Matlab 快速卷积函数 fftfilt 实现对 x(t)的滤波,从高频噪声中提取 x(t)中的单频调幅信号。绘图显示滤波器的频率响应特性曲线、滤波器输出信号的幅频特性图和时域波形图。
代码提示略
实验结果如下:
5、选做题,读取音频信号 motherland.wav,得到 xn;(1)对 xn 进行 I=2 的整数倍 0 值内插,得到音频信号 yn1;(2)设计一个镜像低通滤波器(可在实 验内容 2 的代码上进行修改);(3)对 yn1 进行滤波,得到音频信号 yn2。
① 音频播放:依次播放原音频信号
xn
、
yn1
和
yn2
,体验整数倍
0
值内插后的音质。
参考代码:
[xn,fs]=audioread('motherland.wav');% 读取音频信号
sound(xn,fs); % 播放音频信号,
pause(length(xn)/fs); % 暂停执行程序 length(xn)/fs 秒,确保音频播放完。
I=2 % 实现I=2的整数倍0值内插
for i=1:length(xn);
yn1(I*i-1)=xn(i);
yn1(I*i)= 0;
end
sound(yn1,I*fs); %采样频率变大了,为 I*fs
② 取原音频某段信号,如 n=8000~8199。画出该段信号模拟域幅度谱(横 坐标为 f Hz);画出该段信号 I=2 内插后的模拟域幅度谱;画出该段信号内插 后再经过镜像滤波后的模拟域幅度谱。
参考代码:
Xn=1/fs*fft(xn(8000:8199),N); % 从xn中取200点做谱分析,N可取2048
plot((0:N/2-1)*fs/N,abs(Xn(1:N/2)));% 模拟域幅度谱
Yn1=1/(I*fs)*fft(yn1(16000:16399),N); % 内插后,200点长变成了400点长
plot((0:N/2-1)*I*fs/N,abs(Yn1(1:N/2)));
yn2=filter(b,1,yn1); % 对yn1进行滤波,b为所设计的镜像滤波器
Yn2=1/(I*fs)*fft(yn2(16000:16399),N); % 内插后,200点长变成了400点长
plot((0:N/2-1)*I*fs/N,abs(Yn2(1:N/2)));
三、思考题
按照如下指标要求设计四种选频数字滤波器,要求画出滤波器的幅频特性、相频特性和幅度衰减曲线,标注相关信息,如横坐标,纵坐标的单位,曲线名称等。(设计方法自己查阅资料完成)
- (1) 设计数字低通滤波器,指标为:通带截止频率𝜔𝑝 = 0.2𝜋,阻带截止频率𝜔𝑠 = 0.3𝜋,通带衰减𝛼𝑝 = 1𝑑𝐵,阻带衰减𝛼𝑠 = 24𝑑𝐵。
- (2) 设计数字高通滤波器,指标为:阻带截止频率𝜔𝑠 = 0.4𝜋,通带截止频率𝜔𝑠 = 0.6𝜋,通带衰减𝛼𝑝 = 0.2𝑑𝐵,阻带衰减𝛼𝑠 = 43𝑑𝐵。
- (3) 设计数字带通滤波器,指标为:通带范围0.2𝜋 ≤ 𝜔 ≤ 0.6𝜋,阻带范围0 ≤𝜔 ≤ 0.15𝜋和0.65𝜋 ≤ 𝜔 ≤ 𝜋,通带衰减𝛼𝑝 = 1𝑑𝐵,阻带衰减𝛼𝑠 = 50𝑑𝐵。
- (4) 设计数字带阻滤波器,指标为:阻带范围0.2𝜋 ≤ 𝜔 ≤ 0.6𝜋,通带范围0 ≤ 𝜔 ≤ 0.15𝜋和0.65𝜋 ≤ 𝜔 ≤ 𝜋,通带衰减𝛼𝑝 = 1𝑑𝐵,阻带衰减𝛼𝑠 = 45𝑑𝐵。
解答
函数部分
函数一:通过输入wp,ws,n,可以得到b,反复调用,节省时间
function b=filter_test7(wp,ws,n)%n为窗前的系数
deltaw = ws - wp; % 频率带宽差
N0 = ceil(n * pi / deltaw); % 阶数
N = N0 + mod(N0 + 1, 2); % 确保滤波器阶数为奇数
windows = blackman(N); % 使用窗
wc = (ws + wp) / (2 * pi); % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc, windows);
end
函数二:生成一个xt方便实用
function [xt,t]=XTG(N)
%xt=xtg产生一个长度为N,有加性高频噪声的单频调幅信号xt,采样频率是1000Hz
Fs=1000;%采样频率
T=1/Fs;%采样周期,采样间隔
t=0:T:(N-1)*T;
fc=Fs/10; %载波频率100
f0=fc/10; %基带信号频率10
mt=cos(2*pi*f0*t); %单频基带信号
ct=cos(2*pi*fc*t); %载波信号
xt=mt.*ct; %调制,采样
nt=2*rand(1,N)-1; %产生随机噪声
rp=0.1;As=70; %最大衰减,最小衰减
dev=[10^(-As/20),(10^(rp/20)-1)/(10^(rp/20)+1)]; %衰减系数
[n,fo,mo,w] = firpmord([150 200],[0 1],dev,1000 );
hn = firpm(n,fo,mo,w);
yt=filter(hn,1,10*nt); %滤除高斯白噪声的低频成分生成高通干扰
xt=xt+yt;
主程序
任务一:
%例题2——2
N=64;
beta=7.865;
n=1:N;
wbo=boxcar(N);
wtr=triang(N);
whn=hanning(N);
whm=hamming(N);
wbl=blackman(N);
wka=kaiser(N,beta);
plot(n,wbo,'-',n,wtr,'*',n, whn,'+',n, whm,'.',n,wbl,'o',n,wka,'d');
axis([0,N,0,1.1]);
legend('矩形','三角形','汉宁','哈明','布莱克曼','凯塞')
%例题2——3
wp=0.3*pi;
ws=0.45*pi;
deltaw=ws-wp;
N0=ceil(6.6*pi/deltaw);
N=N0+mod(N0+1,2)%为实现 FIR 类型1偶对称滤波器,应确保 N 为奇数
windows=(hamming(N))';
wc=(ws+wp)/2;
hd=ideal_lp(wc,N);
b=hd.*windows;
[H,w]=freqz(b,1,1000,'whole');
H=(H(1:501))';
w=(w(1:501))';
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
n=0:N-1;
dw=2*pi/1000;
Rp=-(min(db(1:wp/dw+1)))%检验通带波动
As=-round(max(db(ws/dw+1:501)))%检验最小阻带衰减
figure()
subplot(2,2,1);
stem(n,b);
axis([0,N,1.1*min(b),1.1*max(b)]);
title('实际脉冲响应');
xlabel('n');ylabel('h(n)');
subplot(2,2,2);
stem(n,windows);
axis([0,N,0,1.1]);
title('窗函数特性');
xlabel('n');ylabel('wd(n)');
subplot(2,2,3);
plot(w/pi,db);
axis([0,1,-80,10]);
title('幅度频率响应');
xlabel('频率(单位:\pi)');ylabel('H(e^{jomega})');
set(gca,'XTickMode','manual','XTick',[0,wp/pi,ws/pi,1 ]);
set(gca,'YTickMode','manual','YTick',[-50,-20,-3,0]);grid;
subplot(2,2,4);
plot(w/pi,pha);
axis([0,1,-4,4]);
title('相位频率响应');
xlabel('频率(单位:\pi)");ylabel("phi(omega)');
set(gca,'XTickMode','manual','XTick',[0,wp/pi,ws/pi,1]);
set(gca,'YTickMode','manual','YTick',[-3.1416,0,3.1416,4]);grid;
wp=0.3*pi;ws=0.45*pi;
deltaw=ws-wp;
N0=ceil(6.6*pi/deltaw);
N=N0+mod(N0+1,2);%为实现 FIR 类型1偶对称滤波器,应确保 N 为奇数
windows=hamming(N);%使用哈明窗,此句可省略
wc=(ws+wp)/2/pi;%截止频率取归一化通阻带频率的平均值
b=fir1(N-1,wc,windows);%用 firl 函数求系统函数系数,windows 可省略
[H,w]=freqz(b,1,1000,'whole');
H=(H(1:501))';w=(w(1:501))';
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
n=0:N-1;dw=2*pi/1000;
Rp=-(min(db(1:wp/dw+1)));%检验通带波动
As=-round(max(db(ws/dw+1:501)));%检验最小阻带衰减
figure();
subplot(2,2,1);
stem(n,b);
axis([0,N,1.1*min(b),1.1*max(b)]);
title('实际脉冲响应');
xlabel('n');ylabel('h(n)');
subplot(2,2,2);
stem(n,windows);
axis([0,N,0,1.1]);
title('窗函数特性');
xlabel('n');ylabel('wd(n)');
subplot(2,2,3);
plot(w/pi,db);
axis([0,1,-80,10]);
title('幅度频率响应');
xlabel('频率(单位:\pi)');ylabel('H(e^{jomega})');
set(gca,'XTickMode','manual','XTick',[0,wp/pi,ws/pi,1 ]);
set(gca,'YTickMode','manual','YTick',[-50,-20,-3,0]);grid;
subplot(2,2,4);
plot(w/pi,pha);
axis([0,1,-4,4]);
title('相位频率响应');
xlabel('频率(单位:\pi)");ylabel("phi(omega)');
set(gca,'XTickMode','manual','XTick',[0,wp/pi,ws/pi,1]);
set(gca,'YTickMode','manual','YTick',[-3.1416,0,3.1416,4]);grid;
任务二:
%% 指标
wp = 0.24 * pi; % 通带截止频率
ws = 0.3 * pi; % 阻带开始频率
deltaw = ws - wp; % 频率带宽差
N0 = ceil(12* pi / deltaw); % 根据公式计算初始滤波器阶数
N = N0 + mod(N0 + 1, 2); % 确保滤波器阶数为奇数
windows = blackman(N); % 使用窗
wc = (ws + wp) / (2 * pi); % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc, windows); % 设计FIR滤波器
[H, w] = freqz(b, 1, 1000, 'whole'); % 计算频率响应
H = H(1:501)'; % 只取[0, pi]部分
w = w(1:501)';
mag = abs(H);
db = 20 * log10((mag + eps) / max(mag)); % 幅度转换为分贝
pha = angle(H); % 相位响应
n = 0:N-1; % 脉冲响应时间序列
dw = 2 * pi / 1000; % 频率步长
Rp=-(min(db(1:wp/dw+1)));%检验通带波动
As=-round(max(db(ws/dw+1:501)));%检验最小阻带衰减
%绘制图像
figure();
subplot(2, 2, 1);
stem(n, b); % 脉冲响应
axis([0, N-1, 1.1 * min(b), 1.1 * max(b)]);
title('实际脉冲响应');
xlabel('n'); ylabel('h(n)');
subplot(2, 2, 2);
stem(n, windows); % 窗函数特性
axis([0, N-1, 0, 1.1]);
title('窗函数特性');
xlabel('n'); ylabel('w(n)');
subplot(2, 2, 3);
plot(w / pi, db); % 幅度频率响应
axis([0, 1, -80, 10]);
title('幅度频率响应');
xlabel('频率 (单位: \pi)'); ylabel('|H(e^{j\omega})| (dB)');
set(gca, 'XTick', [0, wp/pi, ws/pi, 1]);
set(gca, 'YTick', [-60, -40, -20, 0]); grid on;
subplot(2, 2, 4);
plot(w / pi, pha); % 相位频率响应
axis([0, 1, -4, 4]);
title('相位频率响应');
xlabel('频率 (单位: \pi)'); ylabel('\phi(\omega)');
set(gca, 'XTick', [0, wp/pi, ws/pi, 1]);
set(gca, 'YTick', [-pi, 0, pi]); grid on;
disp(['通带波动 Rp = ', num2str(Rp), ' dB']);
disp(['阻带衰减 As = ', num2str(As), ' dB']);
任务三·:
% 调用 xtg 函数生成加噪声信号
[xt, t] = XTG(1000); % 采样频率为 1000 Hz
% 计算频谱
N = length(xt); % 信号长度
fs = 1000; % 采样频率
X = fft(xt); % 快速傅里叶变换
X_mag = abs(X)/N; % 幅度归一化
f = (0:N-1)*(fs/N); % 频率轴
% 绘制结果
figure();
% 时域波形
subplot(3, 1, 1);
plot(t, xt);
title('信号加噪声波形');
xlabel('t/s');
ylabel('x(t)');
xlim([0 0.2]); % 修改横坐标范围
grid on;
% 信号加噪声的频谱
subplot(3, 1, 2);
plot(f, X_mag);
title('信号加噪声的频谱');
xlabel('f/Hz');
ylabel('幅度');
xlim([0 fs/2]);
grid on;
% 信号加噪声的频谱 (50-150 Hz)
subplot(3, 1, 3);
plot(f, X_mag);
title('信号加噪声的频谱 (50-150 Hz)');
xlabel('f/Hz');
ylabel('幅度');
xlim([50 150]); % 修改横坐标范围为 50-150
xticks(50:10:150); % 设置刻度间隔为 10
grid on;
任务四:
% 参数设置
wp = 0.24 * pi; % 通带截止频率
ws = 0.3 * pi; % 阻带开始频率
n = 12; % 用于计算滤波器阶数的系数
fs = 1000; % 采样频率
[xt, t] = XTG(fs); % 采样频率为 1000 Hz
b =filter_test7(wp,ws,n);
yt=fftfilt(b,xt);
Hyk=abs(fft(yt));
% 计算滤波器的频率响应
[H, f] = freqz(b, 1, 1024, 'whole'); % 计算频率响应
% 绘图
figure;
% 1. 绘制滤波器的频率响应特性
subplot(2, 2, 1);
plot(f * fs / (2 * pi), 20*log10(abs(H)), 'LineWidth', 2); % dB scale
title('FIR 滤波器的频率响应特性');
xlabel('频率 (Hz)');
ylabel('幅度 (dB)');
grid on;
% 时域波形图
subplot(2, 2, 2);
plot(t, yt, 'b'); % 滤波后信号
title('滤波后信号时域波形');
xlabel('时间 (秒)');
ylabel('幅度');
grid on;
% 幅频特性图
subplot(2, 2, 3);
stem(Hyk);
title('滤波器输出信号的幅频特性');
xlabel('频率 (Hz)');
ylabel('幅度');
axis([80,120,min(Hyk),max(Hyk)]);
grid on;
任务五:
% 读取音频信号
[xn, Fs] = audioread('motherland.wav');
sound(xn, Fs);
%pause(length(xn)/Fs);
I = 2; % 插值倍数
yn1 = zeros(I * length(xn), 1); % 插值后的信号初始化
for i = 1:length(xn)
yn1(I*i-1)=xn(i);
yn1(I*i)=0;
end
sound(yn1, I * Fs);
%pause(length(yn1)/(I * Fs));
% 对原始信号和插值信号进行频谱分析
N = 2048;
Xn = 1/Fs*fft(xn(8000:8199), N);
Yn1 = 1/(I*Fs) * fft(yn1(16000:16399), N); % 插值信号对应频段做频谱分析
% 绘制原始信号和插值信号的频谱
figure;
subplot(3, 1, 1);
plot((0:N/2-1)*(Fs/N), abs(Xn(1:N/2)));
title('原始信号频谱');
xlabel('频率 (Hz)');
ylabel('幅度');
subplot(3, 1, 2);
plot((0:N/2-1)*(I*Fs/N), abs(Yn1(1:N/2)));
title('插值信号频谱');
xlabel('频率 (Hz)');
ylabel('幅度');
% 设计镜像低通滤波器对插值信号进行滤波
b = filter_test7(0.24*pi,0.3*pi,11);
yn2 =filter(b, 1, yn1); % 滤波后的信号
sound(yn2, I * Fs); % 播放滤波后的信号
% 频谱分析滤波后的信号
Yn2 = abs(1/Fs * fft(yn2(16000:16399), N)); % 滤波后插值信号频谱
% 绘制滤波后插值信号的频谱
subplot(3, 1, 3);
plot((0:N/2-1)*(I*Fs/N), Yn2(1:N/2));
title('滤波后的插值信号频谱');
xlabel('频率 (Hz)');
ylabel('幅度');
思考题
Fs = 1;
% 低通滤波器设计
%参数
wp = 0.2; % 通带截止频率 (归一化)
ws = 0.3; % 阻带开始频率 (归一化)
dp = 1 - 10^(-1/20); % 通带波动 1dB
ds = 10^(-24/20); % 阻带衰减 24dB
N = firpmord([wp, ws], [1, 0], [dp, ds]); % 估算滤波器阶数
b_lowpass = firpm(N, [0 wp ws 1], [1 1 0 0]); % FIR设计
% 绘制低通滤波器曲线
figure('Name', '低通滤波器特性');
subplot(2, 2, 1);
stem(b_lowpass, 'filled');
title('低通滤波器冲激响应 h(n)');
xlabel('样本点 n'); ylabel('幅度');
subplot(2, 2, 2);
[H, w] = freqz(b_lowpass, 1, 1024);
plot(w/pi, abs(H));
title('低通滤波器幅频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('幅度');
subplot(2, 2, 3);
plot(w/pi, 20*log10(abs(H)));
title('低通滤波器幅频衰减特性');
xlabel('归一化频率 (\times\pi)'); ylabel('衰减 (dB)');
subplot(2, 2, 4);
plot(w/pi, angle(H));
title('低通滤波器相频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('相位 (弧度)');
%高通滤波器设计
%参数
ws = 0.4;
wp = 0.6;
dp = 1 - 10^(-0.2/20); % 0.2dB
ds = 10^(-43/20); % 43dB
N = firpmord([ws, wp], [0, 1], [ds, dp]); % 估算滤波器阶数
b_highpass = firpm(N, [0 ws wp 1], [0 0 1 1]);
% 绘制高通滤波器曲线
figure('Name', '高通滤波器特性');
subplot(2, 2, 1);
stem(b_highpass, 'filled');
title('高通滤波器冲激响应 h(n)');
xlabel('样本点 n'); ylabel('幅度');
subplot(2, 2, 2);
[H, w] = freqz(b_highpass, 1, 1024);
plot(w/pi, abs(H));
title('高通滤波器幅频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('幅度');
subplot(2, 2, 3);
plot(w/pi, 20*log10(abs(H)));
title('高通滤波器幅频衰减特性');
xlabel('归一化频率 (\times\pi)'); ylabel('衰减 (dB)');
subplot(2, 2, 4);
plot(w/pi, angle(H));
title('高通滤波器相频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('相位 (弧度)');
%带通滤波器设计
%参数
wp1 = 0.2; wp2 = 0.6;
ws1 = 0.15; ws2 = 0.65;
dp = 1 - 10^(-1/20); % 1dB
ds = 10^(-50/20); % 50dB
N = firpmord([ws1 wp1 wp2 ws2], [0 1 0], [ds dp ds]); % 估算阶数
b_bandpass = firpm(N, [0 ws1 wp1 wp2 ws2 1], [0 0 1 1 0 0]);
% 绘制带通滤波器曲线
figure('Name', '带通滤波器特性');
subplot(2, 2, 1);
stem(b_bandpass, 'filled');
title('带通滤波器冲激响应 h(n)');
xlabel('样本点 n'); ylabel('幅度');
subplot(2, 2, 2);
[H, w] = freqz(b_bandpass, 1, 1024);
plot(w/pi, abs(H));
title('带通滤波器幅频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('幅度');
subplot(2, 2, 3);
plot(w/pi, 20*log10(abs(H)));
title('带通滤波器幅频衰减特性');
xlabel('归一化频率 (\times\pi)'); ylabel('衰减 (dB)');
subplot(2, 2, 4);
plot(w/pi, angle(H));
title('带通滤波器相频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('相位 (弧度)');
%带阻滤波器设计
%参数
ws1 = 0.2; ws2 = 0.6;
wp1 = 0.15; wp2 = 0.65;
dp = 1 - 10^(-1/20); % 1dB
ds = 10^(-45/20); % 45dB
N = firpmord([wp1 ws1 ws2 wp2], [1 0 1], [dp ds dp]); % 估算滤波器阶数
b_bandstop = firpm(N, [0 wp1 ws1 ws2 wp2 1], [1 1 0 0 1 1]);
% 绘制带阻滤波器曲线
figure('Name', '带阻滤波器特性');
subplot(2, 2, 1);
stem(b_bandstop, 'filled');
title('带阻滤波器冲激响应 h(n)');
xlabel('样本点 n'); ylabel('幅度');
subplot(2, 2, 2);
[H, w] = freqz(b_bandstop, 1, 1024);
plot(w/pi, abs(H));
title('带阻滤波器幅频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('幅度');
subplot(2, 2, 3);
plot(w/pi, 20*log10(abs(H)));
title('带阻滤波器幅频衰减特性');
xlabel('归一化频率 (\times\pi)'); ylabel('衰减 (dB)');
subplot(2, 2, 4);
plot(w/pi, angle(H));
title('带阻滤波器相频特性曲线');
xlabel('归一化频率 (\times\pi)'); ylabel('相位 (弧度)');