我想使用给定的频率响应过滤我的时间向量v
。
Filer作为一组两个向量给出:f
和h
,其中f是频率,h是响应的幅度。
我无法fft
我的数据v
然后在频域中相乘,因为我的数据v
非常大且fft
不可行。
我尝试过Yule-walker方法,但它不适合我的数据。
如何对数据应用此给定的频率响应?
答案 0 :(得分:1)
也许您可以尝试线性相位FIR滤波器。您可以设计这样的滤波器以实现所需的频率响应,然后使用它过滤数据。
首先让我生成一些假设的f
,h
和v
,以便我的解决方案包含一个有效的示例:
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滤波器系数。
在这里,我假设f
均匀间隔,从0开始,以奈奎斯特频率结束。如果不是这种情况,那么也许您可以插入f
和h
以便这是真的。另请注意,生成的过滤器的长度为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
,它为你提供了一些关于滤波器设计的选项。
现在您已拥有滤镜系数,您可以使用filter
或fftfilt
将此滤镜应用于您的数据。请记住考虑过滤延迟。例如:
v_padded = [v; zeros(n,1)];
y_padded = fftfilt(b, v_padded);
y = y_padded(n+1:end);
当然,如果要过滤块中的数据,则应使用后续数据而不是零填充数据:)