【问题标题】:Implementing a Sum of Sincs filter in Matlab在 Matlab 中实现一个 Sincs 滤波器
【发布时间】:2014-12-04 15:07:13
【问题描述】:

我正在尝试实现一个看起来像

的过滤器

在 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 形式。有没有办法在不将输入信号转换到频域的情况下做到这一点?

非常感谢

【问题讨论】:

  • 是的,除了将数据转换到频域之外,我没有看到任何其他方法。另一种可能性是对您的滤波器进行inverse FFT,使其处于时域中,然后通过conv 在时域中使用此滤波器对您的输入信号进行手动卷积。但是,您可以进行一些数学运算并将G 转换为传递函数格式,您可以在那里提取分子和分母系数,但这种工作不适合在这里问,可能更符合 DSP StackExchange:dsp.stackexcahnge.com.

标签: matlab filter


【解决方案1】:

过滤信号可以被视为将您的时域信号与(时域)滤波器内核进行卷积。如果您有信号的滤波器内核,则可以使用conv() 执行卷积。

类似地,时域中的卷积是频域中的乘法,因此您也可以将滤波器的频率响应与信号的傅立叶变换相乘。然后对结果进行逆傅立叶变换,得到滤波后的信号。

您似乎已经计算了滤波器的频率响应。因此,您可以对信号进行傅立叶变换,相乘(必要时添加适当的零),然后进行傅立叶逆变换,或者对滤波器进行傅立叶逆变换以获得内核并将其与信号进行卷积。

对于大型数据集和滤波器,在频域中执行卷积可以明显更快,但我怀疑这对于一维信号是否会很明显。

大纲代码:

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');

请注意,如果您的滤波器尺寸与信号长度相比相当大,这种方法会产生明显的边缘效应。

【讨论】:

  • OP 询问是否有办法做到这一点而不诉诸频域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多