2012-01-15 30 views
1

尋找在用於iTunes可視化API的示例代碼,有一個數據struct包含波形和光譜數據:如何寫一個iTunes的插件提供的頻率信息

struct RenderVisualData { 
    UInt8 numWaveformChannels; 
    UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries]; 

    UInt8 numSpectrumChannels; 
    UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries]; 
}; 
typedef struct RenderVisualData RenderVisualData; 

有2個通道( kVisualMaxDataChannels)和512波形和頻譜數據點(kVisualNumWaveformEntrieskVisualNumSpectrumEntries),整數的0和255

這些之間的等效是用於音頻的視覺表示是有用的。我希望將這些數據(或類似數據)轉換爲Hz中測量的頻率,以便將它們轉換爲音符(基本上是音符)。

這個過程涉及哪些資源,算法等?這些數據傅立葉係數?根據這些數據,我可以如何回到特定時間點的頻率,我可以將其映射到一個音符?

回答

1

我會建議看一些開源項目,並嘗試從他們那裏學習。 FFT Guitar Tuner。另外,如果你更加認真的學習DSP,你可以搜索你的數字信號處理軟件並觀看關於這個主題的完整系列講座。找到一個音頻塊的音符並不是最簡單的任務,因爲我發現自己試圖編程一個吉他調音器。據我所知(即時沒有此字段的一個專家),其需要採取用於獲取音調信息的步驟是:

  1. 採取音頻數據的一些樣品,優選地在兩(256512,1024等)的功率
  2. (可選)應用一個窗口函數,以使其平滑出邊緣,並顯示爲連續時間信號(終點與起點匹配)。
  3. 進行快速傅立葉變換
  4. 音調提取算法。根據您的需要,有幾種不同的算法。根據我的經驗,最容易的是Harmonic Product Spectrum,它可以找到您處理的音頻塊的基本頻率。
1

兩個警告。頻譜數據和音符不是一回事。來自FFT的頻譜數據在每個頻率倉(或陣列單元)之間的頻率間隔與平均回聲音調間的頻率間隔完全不同,並且單個音調間距通常由包含多於1個頻譜頻率倉的豐富頻譜表示。

每個bin的中心頻率與採樣率除以隱含的FFT處理的數據長度相關。

相關問題