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. 结果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐