2010-08-19 162 views
6

我正在尋找一個簡單的(僞)代碼,對採樣的音頻信號進行頻譜反轉。 理想的C++如何對採樣的音頻信號進行頻譜反轉

該代碼應支持不同的採樣率(16/32/48KHz)。

+1

什麼是「頻譜反轉」?有趣的是,谷歌在這裏首先揭示了你的問題。 你想要每個頻率的相位和振幅的倒數?或者你只是想要一個IFFT?或者完全不同的東西? – zerm 2010-08-19 10:22:00

+0

對不起我的不專業的詞彙:我想要低頻成爲高頻,反之亦然(直流偏移將成爲一半採樣頻率的正弦)。 – 2010-08-19 10:30:45

+1

現在我很好奇聽到這聽起來像什麼...... – PeterAllenWebb 2010-08-19 16:38:07

回答

6

將信號混合Fs/2將交換高頻率和低頻率 - 考慮將單位圓周圍的頻譜旋轉半圈。您可以通過將每個其他樣本乘以-1來實現此旋轉。

通過Fs/2混合相當於通過exp(j*pi*n)混合。如果x是輸入和y輸出,

y[n] = x[n] * exp(j*pi*n) = x[n] * [cos(pi*n) + j*sin(pi*n)] 

這容易簡化因爲sin(pi*n)是0,並且cos(pi*n)是交替1,-1。

+0

這麼簡單...令人難以置信 – 2010-09-08 10:31:04

+2

這個技巧在DSP中出現了很多。例如,如果您要設計高通濾波器,通常設計一個具有所需截止比例的低通濾波器比較容易,然後圍繞單位圓旋轉它以使其達到高通。 – mtrw 2010-09-08 12:47:39

1

爲了得到的東西,具有相同類型的時間結構與原來,你需要

  • 創建頻譜(有一些窗口大小)
  • 挑選了一些上下頻率界限,使你會翻轉
  • 翻轉頻譜圖的強度的範圍內
  • 再合成與頻率一致的聲音信號

由於這是一個音頻信號,因此相位都會混亂起來並不重要。無論如何,你一般都聽不到它們。除了翻轉部分,ARSS做譜圖創建和聲音再合成。否則,您可以採取FFT,反轉組件的幅度,並進行逆FFT。但這基本上是荒謬的,因爲它會完全擾亂聲音的時間結構以及頻率結構。

+0

謝謝ARSS使用頻率濾波器組,所以我所能做的只是反轉頻率分檔。我想知道是否有一些數學處理能夠「平滑地」反轉頻率(沒有將頻率劃分爲分箱)。 – 2010-08-20 17:46:33

+0

您可以使用未明確歸檔的小波,但在您​​的情況下幾乎不重要。低頻聲音變化比高頻聲音慢得多,所以翻轉會改變光滑度。 – 2010-08-20 17:58:42

0

使用餘弦沒有多大意義。對於數字信號來說,在這裏運行一個真正的ringmod並不是必需的,在nyquist的情況下反正是正方形。

所以你只需乘以* -1乘以所有其他樣本,就完成了。

沒有延遲,沒有別名,沒有任何東西。

+0

這就是接受的答案所說的。 – 2016-08-23 03:27:52