我正在尝试实现一个看起来像
的过滤器
在Matlab中。我有:
omegas = (-length(t)/2:length(t)/2)*2*pi/tau/10;
SOS_freq_sum = zeros(1,length(omegas));
for i = 1:length(K_set)
k = K_set(i);
SOS_freq_sum = SOS_freq_sum + b_k(i)*sinc(omegas/(2*pi/tau)-k);
end
SOS_filter_in_frequency = (tau/sqrt(2*pi))*((SOS_freq_sum)');
如何使用它来过滤我的数据? Matlab的过滤函数定义了传递函数的分子和denom系数,但不适用于SOS形式。有没有办法在不将输入信号转换到频域的情况下做到这一点?
非常感谢
答案 0 :(得分:1)
过滤信号可视为使用(时域)过滤器内核对时域信号进行卷积。如果您有信号的滤波器内核,则可以使用conv()
执行卷积。
类似地,时域中的卷积是频域中的乘法,因此您还可以将滤波器的频率响应与信号的傅里叶变换相乘。然后逆傅立叶变换结果以获得滤波后的信号。
您似乎已计算过滤器的频率响应。因此,您可以对信号进行傅里叶变换,乘以(必要时适当增加零值),然后进行逆傅立叶变换,或对傅里叶变换进行逆傅里叶变换,得到内核并将其与信号进行卷积。
对于大型数据集和滤波器,在频域中执行卷积可能会明显加快,但我怀疑这对于1D信号是否会引人注意。
大纲代码:
ftsignal=fft(signal);
ftsignal=fftshift(signal); %I think this makes it the same as your frequency response.
ftfiltsignal=ftsignal.*frequecyresponse; %if these are not the same size you will need to zero-pad
filtsignal=ifft(ftfiltsignal);
如果你真的想在某些原因下避免频域中的卷积:
filterkernel=ifft(frequencyresponse);
filteredsignal=conv(signal, filterkernel, 'same');
注意这种方法会产生边缘效应,如果你的滤波器尺寸与你的信号长度相比是大的,那么这种边缘效应可能很重要。