数字信号处理基础(三)-FIR滤波器的设计

发布时间:2025-12-09 16:34:39 浏览次数:3

目录

  • 1. 滤波器
    • 1.1 低通滤波器
    • 1.2 高通滤波器
    • 1.3 带通滤波器
    • 1.4 带阻滤波器
  • 2. 完整代码
  • 3. 结果图

1. 滤波器

1.1 低通滤波器

低通滤波器需要知道低通截止频率,然后采用以下代码实现

% 低通滤波器设计fp=2*10000; % 低通滤波器截止频率,乘以2是因为下面要将模拟频率转换成数字频率b=fir1(30, fp/fs, boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器

1.2 高通滤波器

高通滤波器需要知道高通截止频率,然后采用以下代码实现

% 高通滤波器设计fp2=2*10000; % 高通滤波器截止频率,乘以2是因为下面要将模拟频率转换成数字频率b2=fir1(30, fp2/fs,'high',boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器

1.3 带通滤波器

带通滤波器需要知道两个带通截止频率,然后采用以下代码实现

% 带通滤波器设计fp3=2*9000; % 带通滤波器截止频率1,乘以2是因为下面要将模拟频率转换成数字频率fp4=2*11000; % 带通滤波器截止频率2,乘以2是因为下面要将模拟频率转换成数字频率b3=fir1(30, [fp3/fs,fp4/fs ],boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器

1.4 带阻滤波器

带阻滤波器需要知道两个带阻截止频率,然后采用以下代码实现

% 带阻滤波器设计fp5=2*11000; % 带阻滤波器截止频率1,乘以2是因为下面要将模拟频率转换成数字频率wp=Rb/(Fs/2)fp6=2*90000; % 带阻滤波器截止频率2,乘以2是因为下面要将模拟频率转换成数字频率wp=Rb/(Fs/2)b4=fir1(30, [fp5/fs,fp6/fs ],'stop',boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器

2. 完整代码

clear all; % 清除所有变量close all; % 关闭所有窗口clc; % 清屏%% 基本参数fc1 = 10000; % 信号1的中心频率fs = 200000; % 采样频率,满足奈奎斯特采样定理即可,这里为信号频率的20倍原因是为了采样点数多,时域波形平滑dt = 1/fs; % 采样间隔T = 0.1; % 采样总时长N = T*fs; % 采样点数,N=T/dt=T*fst = 0:dt:(N-1)*dt; % 时间行向量,间隔为dt%% 信号产生sig = sin(2*pi*fc1*t); % 信号figure(1); % 绘制第1幅图subplot(211); % 窗口分割成2*1的,当前是第1个子图 plot(t,sig,'LineWidth',2); % 绘制信号波形axis([0 0.001 -1.5 1.5]); % 坐标轴范围设置xlabel('时间/t'); % 横坐标标签ylabel('幅值'); % 纵坐标title('原始信号'); % 标题grid on; % 打开网格线sig_f = fft(sig); % 对信号进行fftsig_f_2 = abs(sig_f); % fft后取绝对值得到幅度响应sig_f_2 = fftshift(sig_f_2);% 将0-fs频谱移动到-fs/2-fs/2df = 1/T; % 频谱分辨率fs/N=1/Tf=(-N/2:N/2-1)*df; % 频率范围subplot(212); % 窗口分割成2*1的,当前是第2个子图 plot(f,sig_f_2,'LineWidth',2);% 绘制信号的频谱axis([-11000 11000 -inf inf]);% 坐标轴范围设置xlabel('频率/Hz'); % 横坐标标签ylabel('幅值'); % 纵坐标title('原始信号的频谱'); % 标题grid on; % 打开网格线%% 加噪声sig_noise = awgn(sig,20); % 信号sig中加入白噪声,信噪比为SNR=20dBsig_noise_f = fftshift(abs(fft(sig_noise)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2figure(2); % 绘制第2幅图subplot(211); % 窗口分割成2*1的,当前是第1个子图 plot(t,sig_noise,'LineWidth',2);% 绘制加噪信号波形axis([0 0.001 -1.5 1.5]); % 坐标轴范围设置xlabel('时间/t'); % 横坐标标签ylabel('幅值'); % 纵坐标title('加噪信号'); % 标题grid on; % 打开网格线subplot(212); % 窗口分割成2*1的,当前是第2个子图 plot(f,sig_noise_f,'LineWidth',2);% 绘制加噪信号的频谱axis([-11000 11000 -inf inf]);% 坐标轴范围设置xlabel('频率/Hz'); % 横坐标标签ylabel('幅值'); % 纵坐标title('加噪信号的频谱'); % 标题grid on; % 打开网格线%% 滤波器设计% 低通滤波器设计fp=2*10000; % 低通滤波器截止频率,乘以2是因为下面要将模拟频率转换成数字频率b=fir1(30, fp/fs, boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器[h,w]=freqz(b, 1,512); % 生成fir滤波器的频率响应% freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512lvbo_lowpass=fftfilt(b,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数lvbo_lowpass_f = fftshift(abs(fft(lvbo_lowpass)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2figure(3); % 绘制第3幅图 subplot(311); % 窗口分割成3*1的,当前是第1个子图 plot(w/pi*fs/2,20*log(abs(h)),'LineWidth',2); % 绘制滤波器的幅频响应title('低通滤波器的频谱'); % 标题xlabel('频率/Hz'); % x轴标签ylabel('幅度/dB'); % y轴标签grid on; % 打开网格线subplot(312) % 窗口分割成3*1的,当前是第2个子图 plot(t,lvbo_lowpass,'LineWidth',2); % 绘制经过低通滤波器后的信号axis([0,0.001,-1.5,1.5]); % 设置坐标范围title("经过低通滤波器后的信号");% 标题xlabel('时间/s'); % x轴标签ylabel('幅度'); % y轴标签grid on; % 打开网格线subplot(313) % 窗口分割成3*1的,当前是第3个子图 plot(f,lvbo_lowpass_f,'LineWidth',2);% 绘制经过低通滤波器后的信号频谱axis([-11000,11000,-inf,inf]);% 设置坐标范围title("经过低通滤波器后的信号频谱");% 标题xlabel('频率/Hz'); % x轴标签ylabel('幅值'); % y轴标签grid on; % 打开网格线% 高通滤波器设计fp2=2*10000; % 高通滤波器截止频率,乘以2是因为下面要将模拟频率转换成数字频率b2=fir1(30, fp2/fs,'high',boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器[h2,w2]=freqz(b2, 1,512); % 生成fir滤波器的频率响应% freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512lvbo_highpass=fftfilt(b2,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数lvbo_highpass_f = fftshift(abs(fft(lvbo_highpass)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2figure(4); % 绘制第4幅图 subplot(311); % 窗口分割成3*1的,当前是第1个子图 plot(w2/pi*fs/2,20*log(abs(h2)),'LineWidth',2); % 绘制滤波器的幅频响应title('高通滤波器的频谱'); % 标题xlabel('频率/Hz'); % x轴标签ylabel('幅度/dB'); % y轴标签grid on; % 打开网格线subplot(312) % 窗口分割成3*1的,当前是第2个子图 plot(t,lvbo_highpass,'LineWidth',2); % 绘制经过高通滤波器后的信号axis([0,0.001,-1.5,1.5]); % 设置坐标范围title("经过低通滤波器后的信号");% 标题xlabel('时间/s'); % x轴标签ylabel('幅度'); % y轴标签grid on; % 打开网格线subplot(313) % 窗口分割成3*1的,当前是第3个子图 plot(f,lvbo_highpass_f,'LineWidth',2);% 绘制经过高通滤波器后的信号频谱axis([-11000,11000,-inf,inf]);% 设置坐标范围title("经过高通滤波器后的信号频谱");% 标题xlabel('频率/Hz'); % x轴标签ylabel('幅值'); % y轴标签grid on; % 打开网格线% 带通滤波器设计fp3=2*9000; % 带通滤波器截止频率1,乘以2是因为下面要将模拟频率转换成数字频率fp4=2*11000; % 带通滤波器截止频率2,乘以2是因为下面要将模拟频率转换成数字频率b3=fir1(30, [fp3/fs,fp4/fs ],boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器[h3,w3]=freqz(b3, 1,512); % 生成fir滤波器的频率响应% freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512lvbo_bandpass=fftfilt(b3,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数lvbo_bandpass_f = fftshift(abs(fft(lvbo_bandpass)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2figure(5); % 绘制第5幅图 subplot(311); % 窗口分割成3*1的,当前是第1个子图 plot(w3/pi*fs/2,20*log(abs(h3)),'LineWidth',2); % 绘制滤波器的幅频响应title('带通滤波器的频谱'); % 标题xlabel('频率/Hz'); % x轴标签ylabel('幅度/dB'); % y轴标签grid on; % 打开网格线subplot(312) % 窗口分割成3*1的,当前是第2个子图 plot(t,lvbo_bandpass,'LineWidth',2); % 绘制经过带通滤波器后的信号axis([0,0.001,-1.5,1.5]); % 设置坐标范围title("经过带通滤波器后的信号");% 标题xlabel('时间/s'); % x轴标签ylabel('幅度'); % y轴标签grid on; % 打开网格线subplot(313) % 窗口分割成3*1的,当前是第3个子图 plot(f,lvbo_bandpass_f,'LineWidth',2);% 绘制经过带通滤波器后的信号频谱axis([-11000,11000,-inf,inf]);% 设置坐标范围title("经过带通滤波器后的信号频谱");% 标题xlabel('频率/Hz'); % x轴标签ylabel('幅值'); % y轴标签grid on; % 打开网格线% 带阻滤波器设计fp5=2*11000; % 带阻滤波器截止频率1,乘以2是因为下面要将模拟频率转换成数字频率wp=Rb/(Fs/2)fp6=2*90000; % 带阻滤波器截止频率2,乘以2是因为下面要将模拟频率转换成数字频率wp=Rb/(Fs/2)b4=fir1(30, [fp5/fs,fp6/fs ],'stop',boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型% 这里是生成了30阶(31个抽头系数)的矩形窗滤波器[h4,w4]=freqz(b4, 1,512); % 生成fir滤波器的频率响应% freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512lvbo_bandstop=fftfilt(b4,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数lvbo_bandstop_f = fftshift(abs(fft(lvbo_bandstop)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2figure(6); % 绘制第6幅图 subplot(311); % 窗口分割成3*1的,当前是第1个子图 plot(w4/pi*fs/2,20*log(abs(h4)),'LineWidth',2); % 绘制滤波器的幅频响应title('带阻滤波器的频谱'); % 标题xlabel('频率/Hz'); % x轴标签ylabel('幅度/dB'); % y轴标签grid on; % 打开网格线subplot(312) % 窗口分割成3*1的,当前是第2个子图 plot(t,lvbo_bandstop,'LineWidth',2); % 绘制经过带阻滤波器后的信号axis([0,0.001,-1.5,1.5]); % 设置坐标范围title("经过带阻滤波器后的信号");% 标题xlabel('时间/s'); % x轴标签ylabel('幅度'); % y轴标签grid on; % 打开网格线subplot(313) % 窗口分割成3*1的,当前是第3个子图 plot(f,lvbo_bandstop_f,'LineWidth',2);% 绘制经过带阻滤波器后的信号频谱axis([-11000,11000,-inf,inf]);% 设置坐标范围title("经过带阻滤波器后的信号频谱");% 标题xlabel('频率/Hz'); % x轴标签ylabel('幅值'); % y轴标签grid on; % 打开网格线

3. 结果图






需要做网站?需要网络推广?欢迎咨询客户经理 13272073477