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

news2024/11/17 22:34:14

目录

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全测试之使用Docker搭建SQL注入安全测试平台sqli-labs

1 搜索镜像 docker search sqli-labs 2 拉取镜像 docker pull acgpiano/sqli-labs 3 创建docker容器 docker run -d --name sqli-labs -p 10012:80 acgpiano/sqli-labs 4 访问测试平台网站 若直接使用虚拟机,则直接通过ip端口号访问若通过配置域名&#xff0…

2023-5-20-各种编译器的全面学习

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

网站投票软件投票链接制作软件投票链接小程序投票程序

近些年来,第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放,更多人选择微信投票小程序平台,因为它有非常大的优势。 1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

LLVM-Clang交叉编译详细教程

文章目录 前言对比GCC与ClangClang交叉编译参数选项安装交叉编译器交叉编译生成二进制文件Target Arch列表Target Triple列表参考文档后话 前言 最近自己写了个C的小项目,想在Windows编译出其他平台的二进制文件的话,只能交叉编译了,于是就选…

性能测试-JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种,它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈,确保能满足业务需求。很多系统都需要做性能测试,如Web应用、数据库和操作系统等。 性能测试种类非常多,…

深入学习《c语言函数》

📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。 c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。 本章学习函数。 让我们开启c语言学习之旅吧…

Mybatis管理数据库

快速入门 使用idea工具操作数据库使用Mybatis查询所有用户数据第一步创建springboot工程,数据库表user,实体类User第二步,引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)第三步,编写sql语句…

Jmeter工具+ant+jenkins实现持续集成

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具,并配置好环境变量;参考: jmeter默认保存的是.jtl格式的文件,要设置一下bin/jmeter.properties,文件内容,保存jmeter.save.saveservice.output_f…

关于华为云负载均衡ELB健康检查显示离线的排查问题及解决办法

由于项目中经常涉及到检修升级操作,在进行检修升级时,服务就需要停止一段时间,检修结束后重启,在此期间相关的功能页面都将无法访问。甲方反馈,需要停止服务的检修工作暂时不予执行。因此,为了不耽误系统的…

低代码搭建制造管理系统,你要知道的哪些事~

随着数字化转型的推进,制造业也逐渐意识到数字化转型的重要性。数字化转型不仅可以提高制造业的效率和品质,还可以降低成本和提高客户满意度。在数字化转型中,低代码搭建制造管理系统是一种比较有效的方式。本文将介绍低代码搭建制造管理系统…

深入篇【C++】类与对象:再谈构造函数之初始化列表与explicit关键字

深入篇【C】类与对象&#xff1a;再谈构造函数之初始化列表与explicit关键字 Ⅰ.再谈构造函数①.构造函数体赋值②.初始化列表赋值【<特性分析>】1.至多性2.特殊成员必在性3.必走性&#xff1a;定义位置4.一致性5.不足性 Ⅱ.explicit关键字①.隐式类型转化②.作用 Ⅰ.再谈…

Spring Cloud Alibaba 集成 sentinel ,sentinel控制台不能检测到服务,但是在命令行配置启动参数就能看到服务

问题背景 Spring Cloud Alibaba 集成 sentinel &#xff0c;sentinel代码写的限流降级的功能都是好的&#xff0c;但是sentinel控制台不能检测到服务&#xff0c;在程序启动时配置JVM启动参数&#xff08;-Dcsp.sentinel.dashboard.serverlocalhost:18080 -Dproject.namename-…

分公司的负责人要如何承担责任

一、分公司的负责人要如何承担责任 1、分公司的负责人不需要承担责任&#xff0c;因为没有法人资格&#xff0c;没有独立的财产权。根据相关法律规定&#xff0c;分公司的债务由总公司承担连带责任&#xff0c;当然可以先由分公司的全部财产承担。 2、法律依据&#xff1a;《…

小白量化《穿云箭集群量化》(9)用指标公式实现miniQMT全自动交易

小白量化《穿云箭集群量化》&#xff08;9&#xff09;用指标公式实现miniQMT全自动交易 在穿云箭量化平台中&#xff0c;支持3中公式源码运行模式&#xff0c;还支持在Python策略中使用仿指标公式源码运行&#xff0c;编写策略。 我们先看如何使用指标公式源码。 #编程_直接使…

【2023秋招】每日一题:P1087-美团3-18真题 + 题目思路 + 所有语言带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

【C生万物】 指针和数组笔试题汇总 (下)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 承接上文&#xff0c;继续进行指针和数组的练习。 目录 Part2:指针笔试题 1.做题 …

硬件系统工程师宝典(24)-----如何能够正确理解三极管?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到不同材质的磁珠&#xff0c;频率阻抗特性不同&#xff0c;根据磁珠的频率阻抗特性曲线&#xff0c;磁珠在低频时电感起作用&#xff0c;…

Java开源工具库使用之压测JMeter

文章目录 前言一、概念原理1.1 Jmeter 原理1.2 性能测试术语1.3 web项目性能标准 二、常用元件2.1 线程组2.2 取样器2.3 控制器2.4 定时器2.5 前置/后置处理器2.6 配置元件2.7 监听器 三、插件3.1 第三方插件3.2 录制插件 四、JSR223 脚本及函数4.1 JSR223 脚本4.2 函数变量 五…

职场难题:克服压力、提升自我能力,勇闯职场巅峰

在当今激烈的职场竞争中&#xff0c;职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这些问题都是需要克服的问题。作为一名在职场中求生存&#xff0c;求发展的职业人士&#xff0c;我们必须学会适应这些挑战&#xff0c;掌…

Java基础面试题突击系列1

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…