【问题标题】:Low-pass filter in MATLAB returning NaN valuesMATLAB 中的低通滤波器返回 NaN 值
【发布时间】:2014-03-23 01:15:50
【问题描述】:

我正在做一些音频处理。我已经能够将一些音频文件加载到 MATLAB 中,进行播放、混合和合成信号。

但是,现在我想在音频编辑程序中提取类似于均衡器或低通滤波器的基础。我知道 MATLAB 有很多滤波器和内置滤波器设计工具;不过,我只想添加一个简单的低通滤波器。我找到了这个指南: http://www.aquaphoenix.com/lecture/matlab10/page4.html

f = 44100;
n = [1:f];
note_a = 440;
note_csharp = 554.365;
note_e = 659.255;
chord_a = sin(2*pi*(note_a/f)*n)+sin(2*pi*(note_csharp/f)*n)+sin(2*pi*(note_e/f)*n);
fNorm = 200 / (f/2);
[b,a] = butter(10, fNorm, 'low');
chords_low = filtfilt(b, a, chord_a);

我没有收到任何错误,但过滤器输出中的所有值都是 NaN。这是为什么?这首歌是立体声的,是吗?

【问题讨论】:

  • 在调用 butter() 之前 f & fNorm 的值是多少? all(isfinite(funky)) 的结果是什么?
  • f 的值为 44100 fNorm 的值为 0.0091 all(isfinite(funky)) 的值为 [1, 1]
  • 我收到了反对票。有人愿意解释我做错了什么,以便我下次可以避免这样做吗?我认为这个问题已经说得很清楚了,但也许我错了。它也不过分简单化。在发布之前,我尝试用谷歌搜索答案半小时。请随时指出我做错了什么。
  • 我认为你在 meta 上得到了很好的答案。如果您删除最后一部分(这是一个不同的问题),我会投票重新打开它。

标签: matlab audio filter signal-processing


【解决方案1】:

对于截止频率较低的设计类型而言,滤波器的阶数太高,因此会出现数值问题。为了快速解决问题,请将Butterworth filter 的阶数降低到略低于 10。8 阶滤波器适用于您的设计,或者提高截止频率也会产生真正有价值的输出。

如果您想要一个具有设计指定频率响应的滤波器,您需要级联低阶部分。 See a detailed old answer I made for information on how to go about this。 tf2sos 函数是你的朋友。

【讨论】:

  • 听上去比我想象中的更波涛汹涌,但确实奏效了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2016-02-13
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多