[已解决] butter滤波器的阶数增加后结果异常

[复制链接]
Shadow3d 发表于 2021-10-19 15:11:52
本帖最后由 Shadow3d 于 2021-10-19 15:13 编辑

我在通过 butter() 函数生成了滤波器参数时发现,当我将滤波器阶数设为 4 时,滤波结果看起来很正常,但是当我将滤波器阶数设为 6 时,滤波结果完全异常,我想请教一下大家:               
        1. 为什么会这样呢?
        2. 该怎么解决这个问题呢?
谢谢大家!

代码如下:(只需要修改 NUM_ORD 变量后运行就可以复现上文描述的现象)
  1. clear,clc,close all;    % 清除之前的计算记录
  2. format('long');

  3. N = 8000;               % 采样点数
  4. Fs = 8000;              % 采样率
  5. t = 0:1/Fs:1-1/Fs;      % 采样时刻
  6. f = -N/2:N/2-1;         % 频谱图横坐标
  7. NUM_ORD = 4;            % 滤波器阶数

  8. % 原始信号: 由 直流 + 1Hz + 100Hz + 1000Hz 组成
  9. raw_data = sin(2*pi*t) + sin(2*pi*100*t) + sin(2*pi*1000*t) + 0.5;  

  10. [ceof_b, ceof_a] = butter(NUM_ORD, 2/4000, 'high');     % 滤波器设计
  11. data_after_butter = filter(ceof_b, ceof_a, raw_data);   % 滤波

  12. %% 对原始信号以及滤波后的信号作图
  13. subplot(221);
  14. plot(raw_data);
  15. title('raw-data');

  16. subplot(222);
  17. plot(f, fftshift(abs(fft(raw_data)/N)));
  18. title('raw-data FFT');

  19. subplot(223);
  20. plot(data_after_butter);
  21. title('data-after-butter');

  22. subplot(224);
  23. plot(f, fftshift(abs(fft(data_after_butter)/N)));
  24. title('data-after-butter FFT');
复制代码




最佳答案


hehehahei 发表于 2021-10-23 14:58:09
滤波器阶数过高造成滤波器数值不稳定,因此输出结果出错
回复此楼

3 条回复


hehehahei 发表于 2021-10-23 14:58:09
滤波器阶数过高造成滤波器数值不稳定,因此输出结果出错
回复此楼

Shadow3d 发表于 2021-12-17 15:43:45
hehehahei 发表于 2021-10-23 14:58
滤波器阶数过高造成滤波器数值不稳定,因此输出结果出错

请问这个问题有什么解决的方案吗?

a1b2c3 发表于 2022-1-5 15:12:58
Shadow3d 发表于 2021-12-17 15:43
请问这个问题有什么解决的方案吗?

把[ceof_b, ceof_a] = butter(NUM_ORD, 2/4000, 'high');中的3dB截止频率 2/4000调整大一点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表