2011-12-16 106 views
2

假设您有一些数据是音调加噪声。更改FFT内容

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

我想打掉音峰在FFT使做IFFT将只是噪声数据结果。我的算法将是一个for循环,循环遍历abs(fft)的每个索引以查找峰值。如果有峰值,我会用嘈杂的数据点代替峰值。

问题是,在fft完成后,为了可视化数据,通常我会使用plot(abs(fft))。但是,要做到这一点,虚拟数据也是需要的。因此,我不确定我会如何去做“敲倒高峰”或摆脱它,以便我可以使用ifft函数。我想我必须用虚数来工作。

有什么建议吗? :X

谢谢你的帮助。

+2

使用高通滤波器? – PearsonArtPhoto 2011-12-16 00:32:19

+0

@Pearsonartphoto - 这是一个聪明的答案!但是,我想稍后再扩展这个问题,以便消除随机音,所以我不知道截止频率是多少。 – 2011-12-16 00:37:41

+2

高通滤波器在这里是不合适的,因为噪声(理论上)是宽带的 - 他会敲掉噪声和信号。 – dantswain 2011-12-16 00:40:15

回答

2

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

编辑回复:您的评论:

不要让虚数混淆你。无论如何,它们并不是真正的“想象”!只需要在给定的频率下表示正弦波,就需要两个值:幅度和相位。幅度是你曾经看过的,它决定了我们有多少给定频率的。相位相对于某点(例如t = 0)确定转变,这也是非常重要的。作为一个例子,将FFT用相同频率的信号(称为正弦和余弦波) - 幅度看起来相同,但相位将不同!如果我们没有相位,IFFT不知道是给我们一个正弦波还是一个余弦波,或者两者之间的东西。

当然,幅度和相位与真实和想象不同,但有一个简单的公式来转换它们。无论哪种方式,我们使用两个数字来表示每个频率。

1

你可以在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。它取决于信号的采样与带宽的比较,以及噪声的特性。