专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
【安富莱——DSP教程】第40章 IIR滤波器的实现
2019-07-14 22:21
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
6146
5
1320
第40章
IIR
滤波器的实现
本章节讲解IIR滤波器直接I型的低通,高通,带通和带阻滤波器的实现。40.1 IIR滤波器介绍40.2
matlab
工具箱fdatool生成IIR滤波器系数40.3 IIR低通滤波器设计40.4 IIR高通滤波器设计40.5 IIR带通滤波器设计40.6 IIR带阻滤波器设计40.7 总结
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
硬汉Eric2013
2019-07-15 13:50
40.4 IIR高通滤波器设计
40.4.1 fdatool获取高通滤波器系数
设计一个如下的例子: 信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个巴特沃斯滤波器高通滤波器,采用直接I型,截止频率140Hz,采样400个数据,滤波器阶数设置为4。fadtool的配置如下:
配置好高通滤波器后,具体滤波器系数的生成大家参考本章第二小节的方法即可。
40.4.2 高通滤波器实现
通过工具箱fdatool获得高通滤波器系数后在开发板上运行函数arm_biquad_cascade_df1_f32来测试高通滤波器的效果。
#define numStages 2 /* 2阶IIR滤波的个数 */
#define TEST_LENGTH_SAMPLES 400 /* 采样点数 */
static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
static float32_t testOutput[TEST_LENGTH_SAMPLES]; /* 滤波后的输出 */
static float32_t IIRStateF32[4*numStages]; /* 状态缓存,大小numTaps + blockSize - 1*/
/* 巴特沃斯高通滤波器系数 140Hz */
const float32_t IIRCoeffs32HP[5*numStages] = {
1.0f, -2.0f, 1.0f, 0.9845430147411518f, -0.54456536085081642f,
1.0f, -2.0f, 1.0f, 0.74471447786432121f, -0.16831887384397309f,
};
/*
*********************************************************************************************************
* 函 数 名: arm_iir_f32_hp
* 功能说明: 调用函数arm_iir_f32_hp实现高通滤波器
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void arm_iir_f32_hp(void)
{
uint32_t i;
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleValue;
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32HP[0], (float32_t
*)&IIRStateF32[0]);
/* IIR滤波 */
arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
/*放缩系数 */
ScaleValue = 0.63227709389799203f * 0.47825833792707356f;
/* 打印滤波后结果 */
for(i=0; i<TEST_LENGTH_SAMPLES; i++)
{
printf("%f ", testOutput[i]*ScaleValue);
}
}
复制代码
运行如上函数可以通过串口打印出函数arm_biquad_cascade_df1_f32滤波后的波形数据,下面通过Matlab绘制波形来对比Matlab计算的结果和ARM官方库计算的结果。 对比前需要先将串口打印出的一组数据加载到Matlab中, arm_biquad_cascade_df1_f32的计算结果起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:
fs=1000; %设置采样频率 1K
N=400; %采样点数
n=0:N-1;
t=n/fs; %时间序列
f=n*fs/N; %频率序列
x1=sin(2*pi*50*t);
x2=sin(2*pi*200*t); %50Hz和200Hz正弦波
subplot(211);
plot(t, x2);
title('滤波后的理想波形');
grid on;
subplot(212);
plot(t, sampledata);
title('ARM官方库滤波后的波形');
grid on;
复制代码
Matlab计算结果如下:
从上面的波形对比来看,matlab和函数arm_biquad_cascade_df1_f32计算的结果基本是一致的。为了更好的说明滤波效果,下面从频域的角度来说明这个问题,Matlab上面运行如下代码:
fs=1000; %设置采样频率 1K
N=400; %采样点数
n=0:N-1;
t=n/fs; %时间序列
f=n*fs/N; %频率序列
x = sin(2*pi*50*t) + sin(2*pi*200*t); %50Hz和200Hz正弦波合成
subplot(211);
y=fft(x, N); %对信号x做FFT
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
grid on;
y3=fft(sampledata, N); %经过IIR滤波器后得到的信号做FFT
subplot(212);
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('IIR滤波后信号FFT');
grid on;
复制代码
Matlab计算结果如下:
上面波形变换前的FFT和变换后FFT可以看出,50Hz的正弦波基本被滤除。
加载中...
查看其它5个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
40.4.1 fdatool获取高通滤波器系数 设计一个如下的例子: 信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个巴特沃斯滤波器高通滤波器,采用直接I型,截止频率140Hz,采样400个数据,滤波器阶数设置为4。fadtool的配置如下:
配置好高通滤波器后,具体滤波器系数的生成大家参考本章第二小节的方法即可。40.4.2 高通滤波器实现 通过工具箱fdatool获得高通滤波器系数后在开发板上运行函数arm_biquad_cascade_df1_f32来测试高通滤波器的效果。
- #define numStages 2 /* 2阶IIR滤波的个数 */
- #define TEST_LENGTH_SAMPLES 400 /* 采样点数 */
-
- static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
- static float32_t testOutput[TEST_LENGTH_SAMPLES]; /* 滤波后的输出 */
- static float32_t IIRStateF32[4*numStages]; /* 状态缓存,大小numTaps + blockSize - 1*/
-
- /* 巴特沃斯高通滤波器系数 140Hz */
- const float32_t IIRCoeffs32HP[5*numStages] = {
- 1.0f, -2.0f, 1.0f, 0.9845430147411518f, -0.54456536085081642f,
- 1.0f, -2.0f, 1.0f, 0.74471447786432121f, -0.16831887384397309f,
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: arm_iir_f32_hp
- * 功能说明: 调用函数arm_iir_f32_hp实现高通滤波器
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void arm_iir_f32_hp(void)
- {
- uint32_t i;
- arm_biquad_casd_df1_inst_f32 S;
- float32_t ScaleValue;
-
- /* 初始化 */
- arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32HP[0], (float32_t
- *)&IIRStateF32[0]);
-
- /* IIR滤波 */
- arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
-
- /*放缩系数 */
- ScaleValue = 0.63227709389799203f * 0.47825833792707356f;
-
- /* 打印滤波后结果 */
- for(i=0; i<TEST_LENGTH_SAMPLES; i++)
- {
- printf("%f
", testOutput[i]*ScaleValue);
- }
- }
复制代码运行如上函数可以通过串口打印出函数arm_biquad_cascade_df1_f32滤波后的波形数据,下面通过Matlab绘制波形来对比Matlab计算的结果和ARM官方库计算的结果。 对比前需要先将串口打印出的一组数据加载到Matlab中, arm_biquad_cascade_df1_f32的计算结果起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:- fs=1000; %设置采样频率 1K
- N=400; %采样点数
- n=0:N-1;
- t=n/fs; %时间序列
- f=n*fs/N; %频率序列
-
- x1=sin(2*pi*50*t);
- x2=sin(2*pi*200*t); %50Hz和200Hz正弦波
- subplot(211);
- plot(t, x2);
- title('滤波后的理想波形');
- grid on;
-
- subplot(212);
- plot(t, sampledata);
- title('ARM官方库滤波后的波形');
- grid on;
复制代码Matlab计算结果如下:从上面的波形对比来看,matlab和函数arm_biquad_cascade_df1_f32计算的结果基本是一致的。为了更好的说明滤波效果,下面从频域的角度来说明这个问题,Matlab上面运行如下代码:
- fs=1000; %设置采样频率 1K
- N=400; %采样点数
- n=0:N-1;
- t=n/fs; %时间序列
- f=n*fs/N; %频率序列
-
- x = sin(2*pi*50*t) + sin(2*pi*200*t); %50Hz和200Hz正弦波合成
-
- subplot(211);
- y=fft(x, N); %对信号x做FFT
- plot(f,abs(y));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('原始信号FFT');
- grid on;
-
- y3=fft(sampledata, N); %经过IIR滤波器后得到的信号做FFT
- subplot(212);
- plot(f,abs(y3));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('IIR滤波后信号FFT');
- grid on;
复制代码Matlab计算结果如下:上面波形变换前的FFT和变换后FFT可以看出,50Hz的正弦波基本被滤除。
一周热门 更多>