2009-11-25 81 views
1

如本例How to extract frequency information from an input audio stream (using PortAudio)?我很好奇portaudio和numpy的...如何使用numpy的與portaudio提取低音,中高音

我不是100%地肯定FFT,我怎麼可以通過numpy的一個大塊,並獲得三個值從-1.0到1.0的低音,中音和高音?

我不介意,如果這只是一個通道,因爲我可以讓這個音頻部分的意義上說,它是在我的面前時,遊我看着他們:)的數學

+0

你想要-1到1.0是什麼意思?你用什麼頻率範圍來定義低音,中音和高音? – 2009-11-25 01:48:41

回答

1

其實,你不會使用傅立葉變換來做到這一點。

將低音,中音和高音中的任何音頻信號分開通常使用濾波器來完成。 A filter是衰減某些頻率範圍的信號處理設備。濾波器可以數字化或電子化。例如,它們用於揚聲器中的音頻交叉系統。

要獲得低頻低音部分,您可以使用低通濾波器。低通濾波器濾除高頻。他們也被稱爲'高切'過濾器。
要獲得中頻部分,您需要使用帶通濾波器。帶通濾波器濾除低頻和高頻。他們也被稱爲「鐘形過濾器」。
要獲得高頻高音部分,您可以使用高通濾波器。高通濾波器濾除任何低頻。他們也被稱爲「低切」濾鏡。

其實,你也可以只使用高通和低通濾波器。如果從原始信號中減去兩個濾波後的信號,結果將是一個帶通濾波信號。這爲您節省了一個過濾器。

每個濾波器都有一個閾值頻率。閾值頻率是一個特殊的頻率,濾波器應從該頻率開始濾波。根據濾波器順序,信號將衰減6 dB/oct(一階),12 dB/oct(二階),18 dB/oct(三階)等。對於您的應用,二階設計是大概很好。
請注意,濾波器通常會在某些方面混亂您的信號,並且順序越高,聽到的聲音就越多。順便說一下,這是純粹的物理學,適用於包括傅里葉變換在內的所有信號處理。

使用這三個濾波器(可以)相當於僅用三個頻譜點進行傅里葉變換。

1

Fourier Transform,在你選擇的SO問題的選定答案中提到,它給你提供了「頻譜」 - 一個大的數值集合,給出了各個頻率範圍/頻率片段(例如以赫茲表示)中的每個頻率的聲音強度。

如何根據需要將1000個強度(比如說每個10赫茲頻譜切片中的一個)轉換成三個數字,當然這是一個啓發式問題 - 例如,您可以確定哪些頻率範圍對應於「低音」和「高音」,其間的一切都是「中」,並計算每個頻率的平均強度。對於它的價值,我認爲「低音」的通用慣例高達250Hz,對於「高音」6KHz及以上(介於「中音」之間),cfr例如this page - 但它是相當任意的約定,所以,「挑你的毒藥」 - - !)

一旦你的相對水平,你會想對於他們歸彼此並適當擴展他們的謊言在你想要的範圍內(大概是對數尺度的,因爲這是人類聽力的工作原理;-)。

+0

選擇頻率是一個很好的觀點,現在使用三個相同大小的範圍就足夠了。 我寧願能夠從numpy中取回3片,而不是使用python轉換頻譜,以獲得速度。 由於這是圖形這可能是足夠的,如果不是我可以在頻率後面亂搞。 主要優先考慮的是性能,而不是在純python中進行太多的處理。 – 2009-11-25 22:03:13