我正在尝试实现一个过滤器,它看起来像
在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的滤波函数定义了传递函数的分子和分母系数,但不是SOS形式。有没有办法在不将输入信号转换到频域的情况下做到这一点?
非常感谢
发布于 2014-12-04 16:49:52
滤波信号可以看作是将时域信号与(时域)滤波器核进行卷积。如果你有你的信号的滤波内核,你可以用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');
注意:这种方法将产生边缘效应,如果你的滤波器大小比你的信号长度大得多,那么边缘效应就会很明显。
https://stackoverflow.com/questions/27297312
复制相似问题