2011-12-16 154 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。它取決於信號的採樣與帶寬的比較,以及噪聲的特性。