目录
- 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*fs
t = 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); % 对信号进行fft
sig_f_2 = abs(sig_f); % fft后取绝对值得到幅度响应
sig_f_2 = fftshift(sig_f_2);% 将0-fs频谱移动到-fs/2-fs/2
df = 1/T; % 频谱分辨率fs/N=1/T
f=(-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=20dB
sig_noise_f = fftshift(abs(fft(sig_noise)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2
figure(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)和采样点数(默认)512
lvbo_lowpass=fftfilt(b,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数
lvbo_lowpass_f = fftshift(abs(fft(lvbo_lowpass)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2
figure(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)和采样点数(默认)512
lvbo_highpass=fftfilt(b2,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数
lvbo_highpass_f = fftshift(abs(fft(lvbo_highpass)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2
figure(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)和采样点数(默认)512
lvbo_bandpass=fftfilt(b3,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数
lvbo_bandpass_f = fftshift(abs(fft(lvbo_bandpass)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2
figure(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)和采样点数(默认)512
lvbo_bandstop=fftfilt(b4,sig_noise); % 对信号进行滤波,sig_noise是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数
lvbo_bandstop_f = fftshift(abs(fft(lvbo_bandstop)));% 进行fft,并且将0-fs频谱变换到-fs/2-fs/2
figure(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. 结果图