algorithm - 更改 FFT 内容

标签 algorithm matlab fft

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

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

我正在尝试降低 fft 中的音调峰值,以便进行 ifft 时只会得到噪声数据。我的算法是一个 for 循环,它循环访问 abs(fft) 的每个索引以查找峰值。如果存在峰值,我会用噪声数据点代替该峰值。

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

有什么建议吗? :X

感谢您的帮助。

最佳答案

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

编辑回复:您的评论:

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

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

关于algorithm - 更改 FFT 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528463/

相关文章:

c++ - 将 fftw 与列主方矩阵一起使用( Armadillo 库)

javascript - 有效地计算复杂形状的轮廓

java - 比较两个数组列表以保留它们之间的增量的有效方法

java - Redis过期不起作用

java - 第二高的数字 ArrayList

matlab - 如何在 Matlab 中使用谷歌翻译?

matlab - 删除包含特定范围之外的任何数字的行 - MATLAB

matlab - 尝试在 MATLAB 中编写一个函数来播放给定音符(频率)和长度向量的歌曲

python - Numpy FFT 在 meshgrids 上失败?

audio - 婴儿哭声检测