Matlab滤波问题

4
我有一个数据数组,它是时域的。每个数据表示幅度,并且该数据以10,000Hz的频率采样。
我想在两个频率f1f2之间进行带通滤波。我认为需要进行低通滤波和高通滤波。信号经过FFT,然后通过两个滤波器,然后进行反向FFT。
我的问题是:是否有一种简单的方法来进行低通和高通滤波? 我不知道如何根据两个截止频率导出传递函数。
有人知道吗?
谢谢

1
为了获得一个真实、完全指定的合理质量滤波器,您可能还想规定阻带衰减、通带波动和过渡宽度。无论您做什么,都不要只将FFT的一些bin清零。 - hotpaw2
3个回答

3

在Tristan的回答基础上,这里提供一些Octave代码,可能与Matlab兼容。butter函数可以为您推导传递函数系数。 alt text.alt text

hz = 8000;
x = [1:1:hz*10];
t = x./hz;
pi = 3.1415;

% Create signal with 10 hz, 200 hz and 500 hz components
raw_signal = sin(10*2*pi*t)+sin(200*2*pi*t)+sin(500*2*pi*t);

% View Raw Signal Over .1 Second Window
plot(t, raw_signal)
title('Raw Signal with 10Hz, 200Hz, 500Hz Components')
xlabel('Time (Sec)')
ylabel('Amplitude')
set(gca,'XLim', [5, 5.1]);

% Create Band Pass Butterworth Filter
[S_numer, S_denom] = butter(5, [100/hz 350/hz]);
band_passed_signal = filter(S_numer, S_denom, raw_signal);

% View Band Pass Filtered Signal Over .1 Second Window
plot(t, band_passed_signal)
title('Band Pass Filtered Signal')
xlabel('Time (Sec)')
ylabel('Amplitude')
set(gca,'XLim', [5, 5.1]);

2
MATLAB有工具可以进行滤波,因此您不需要自己进行FFT-IFFT操作(这可能会导致一些问题)。尝试使用butterfilter的组合来实现您想要的功能。 butterButter filterFilter

2
如果您有信号处理工具箱,我建议您使用设计您的滤波器,它是一个GUI工具,用于滤波器设计,还显示幅度和相位响应等。您需要的是带通滤波器。它也可以由低通滤波器和高通滤波器构成,就像您所建议的那样,但Matlab也可以直接为您提供带通滤波器。

如果您没有该工具箱,我建议您参考《科学家和工程师数字信号处理指南》,整本书都可以在线获取,并且有很多基本示例代码,易于转换为Matlab代码。例如:Designing bandpass windowed sinc filter


基础信号处理??为什么有人想做那个? - Nathan Fellman
1
显然,你不会在真正的应用程序中使用Basic代码,但正如书中所说:“学习DSP与使用DSP有非常不同的要求”。因此,在这种情况下,Basic更像是一种伪代码,可以轻松地翻译成任何语言。 - Matti Pastell
@NathanFellman:Basic是3十年前所有个人电脑通用的编程语言。因此,在Fortran之后,但在C变得更加普遍之前,它是一种历史性的共同语言。而“真正”的DSP汇编语言通常极其不可移植。 - hotpaw2

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