【问题标题】:Altering the FFT content改变 FFT 内容
【发布时间】:2011-12-16 00:30:58
【问题描述】:

假设您有一些音调加噪声的数据。

t=0:0.01:10;
y=sin(t) + rand(1,length(t));

我正在尝试降低 fft 中的音调峰值,以便只使用噪声数据进行 ifft。我的算法将是一个循环遍历 abs(fft) 的每个索引以查找峰值的 for 循环。如果有一个峰值,我会用嘈杂的数据点代替那个峰值。

问题是,在 fft 完成后,为了可视化数据,通常我会使用 plot(abs(fft))。但是,要进行 ifft,还需要虚构数据。因此,我不确定我将如何准确地“降低峰值”或摆脱它,以便我可以使用 ifft 函数。我想我必须使用虚数。

有什么建议吗? :X

感谢您的帮助。

【问题讨论】:

  • @Pearsonartphoto - 这是一个聪明的答案!但是,我想稍后扩展这个问题,以便可以消除随机音调,所以我不知道截止频率是多少。
  • 这里不适合使用高通滤波器,因为噪声(理论上)是宽带的 - 他会降低噪声和信号。

标签: algorithm matlab fft


【解决方案1】:

您将不得不使用虚数,但我不明白为什么这是个问题。您仍然可以使用幅度 (abs) 表示来查找峰值,但是当您“将它们击倒”时,您将放置另一个复杂的值。由您决定如何确定该值应该是什么 - 您可以将其设置为零,插入本地频率,插入一个随机数...

编辑回复:您的评论:

不要让虚数迷惑您。无论如何,它们并不是真正的“想象”!只是为了表示给定频率的正弦波,您需要两个值:幅度和相位。幅度是您习惯查看的内容,它决定了我们拥有给定频率的多少。相位决定了相对于某个点(例如 t = 0)的 shift,这也非常重要。例如,将 FFT 用于具有相同频率的信号(例如正弦波和余弦波) - 幅度看起来相同,但相位会不同!如果我们没有相位,IFFT 将不知道是给我们一个正弦波还是一个余弦波,或者介于两者之间。

当然,幅度和相位与实数和虚数不是一回事,但是有一个简单的公式可以将它们转换。无论哪种方式,我们都使用两个数字来表示每个频率。

【讨论】:

  • 哦!是的,这是真的。虚数让我感到困惑! @_@ 谢谢。这应该可以解决。
  • @stefan 我确定我过度简化了,但你能扩展一下:幅度在什么方面不相关?
  • @aganders3 我的评论有点愚蠢,书面同意。然而,当我们讨论 fft 时讨论相位而不是频率有点弱;-)
【解决方案2】:

您可以在 abs(fft(y)) 信号中查找“峰值”,并通过查看 fft 本身的方差将它们替换为随机复数值,类似于

h = fft(y);

peaks = your_peak_finding_algorithm(abs(fft(y)));

real_noise = std(real(h));
imag_noise = std(imag(h));

h(peaks) = real_noise*randn(size(peaks)) + i*imag_noise*randn(size(peaks))

y_new = ifft(h);

然而,我强烈质疑这是否真的是你想要做的。如果这是一个学术练习,那很好,但如果它是为了任何类型的实际应用,那么我建议做一些研究。有大量关于降噪以及检测和过滤信号音调的文献。

另请注意fft 中的信息不仅仅是与您的正弦曲线相关的单个峰值点。见Window function。这取决于信号的采样与其带宽的比较,以及噪声的特性。

【讨论】:

  • 感谢您的提示。我会调查一下。 :]
猜你喜欢
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2020-11-24
  • 2011-10-25
  • 2010-12-05
相关资源
最近更新 更多