使用频率模型

时间:2016-01-27 19:27:52

标签: matlab

我想使用给定的频率响应过滤我的时间向量v。 Filer作为一组两个向量给出:fh,其中f是频率,h是响应的幅度。 我无法fft我的数据v然后在频域中相乘,因为我的数据v非常大且fft不可行。 我尝试过Yule-walker方法,但它不适合我的数据。

如何对数据应用此给定的频率响应?

1 个答案:

答案 0 :(得分:1)

也许您可以尝试线性相位FIR滤波器。您可以设计这样的滤波器以实现所需的频率响应,然后使用它过滤数据。

首先让我生成一些假设的fhv,以便我的解决方案包含一个有效的示例:

n = 20;                  % (desired filter order)/2
Fs = 50;                 % Data sampling rate
f = (0:n)'/n * (Fs/2);   % Freq for filter response
h = (f < 10);            % Hypothetical low-pass filter
t = (0:1000)'/Fs;
v = sin(t) + sin(2*pi*20*t);  % Hypothetical data

使用ifft

设计FIR滤波器

您可以对滤波器的频率响应进行傅里叶变换,以获得FIR滤波器系数。

在这里,我假设f均匀间隔,从0开始,以奈奎斯特频率结束。如果不是这种情况,那么也许您可以插入fh以便这是真的。另请注意,生成的过滤器的长度为2*n,其中n = length(f)-1

由于我们假设一个对称的实数滤波器,滤波器应该对负频率具有相同的响应。 ifft期望频率从零开始,因此这些负频率响应会混淆到更高的频率。假设h是列向量:

h_shifted = [h; flipud(h(2:end-1))];

然后我们对此进行逆变换并将其移回:

b_shifted = ifft(h_shifted);
b = [b_shifted(n+1:end); b_shifted(1:n)];

如果你有信号处理工具箱,你也可以尝试designfilt,它为你提供了一些关于滤波器设计的选项。

过滤数据

现在您已拥有滤镜系数,您可以使用filterfftfilt将此滤镜应用于您的数据。请记住考虑过滤延迟。例如:

v_padded = [v; zeros(n,1)];
y_padded = fftfilt(b, v_padded);
y = y_padded(n+1:end);

当然,如果要过滤块中的数据,则应使用后续数据而不是零填充数据:)