使用Octave创建低通滤波器

3

虽然我有一个在Octave中编写的低通滤波器示例,并且我确定它有效,但我不理解。

这个滤波器是如何工作的?我怎么知道这个滤波器的截止频率?

original_data是我以1Hz获得的水质数据的一列。

l = rows(original_data);
a = fft(original_data);
for i = (1:l);
 if i >9
  a(i) = 0;
 endif
endfor
b = fft(original_data);
for i = (1:l)
 if i > 1
  b(i) = 0;
 endif
endfor
c = real(ifft(a));
c(1);
d = real(ifft(a))*2-c(1);

如果您有任何想法,请帮助我。


3
这是一种非常糟糕的滤波方式 - 在频域中它就像一道砖墙,这意味着在时域中将会有严重的振铃伪影。在频域中使用窗函数可以避免这种情况。 - undefined
谢谢,保罗。你知道怎样确定这个滤波器的截止频率吗? - undefined
截止频率取决于FFT的大小,该大小似乎为l,因此其约为Fs * 10 / l。你提到Fs = 1 Hz,所以大约为10 / l Hz。 - undefined
2个回答

3

我同意评论,有很多功能可以让您正确地设计低通滤波器(请参见http://octave.sourceforge.net/signal/overview.html,特别是IIR和FIR滤波器设计部分)。设计好滤波器后,您可以使用filterfiltfilt函数应用它。

例如,一个简单的方法是:

[b,a] = butter(n, Wc) % low pass Butterworth filter with cutoff pi*Wc radians - choose the order of the filter n and cut-off frequency Wc to suit
filtered_data = filter(b,a,original_data);

0
首先,重要的是要知道在频域中处理信号并不是最好的方法,时域方法可以很好地工作!
你想知道截止频率吗?你需要知道采样率和FFT的长度来计算FFT对应频率的频率分量。
采样率 = FS,首先你需要计算奈奎斯特频率。
Nyquist = FS / 2;

现在找到频率分辨率,在这种情况下,你的fft大小与原始数据相同。
Resolution=Nyquist / (length(original_data) / 2);

好的,差不多了,你将值0放在FFT的前八个(8)个bin中,现在你需要找到对应bin的频率!

round(1 * Resolution)
round(2 * Resolution)
round(3 * Resolution)
.
.
round(8 * Resolution)

结果是截止频率,这意味着你将会削减第一个和第八个频率区间之间的频率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接