我正在嘗試創建一個帶8個LED條的自制頻譜分析儀。不確定如何將FFT數據用於頻譜分析儀
我正在努力的部分是執行FFT並瞭解如何使用結果。
到目前爲止,這是我:
import opc
import time
import pyaudio
import wave
import sys
import numpy
import math
CHUNK = 1024
# Gets the pitch from the audio
def pitch(signal):
# NOT SURE IF ANY OF THIS IS CORRECT
signal = numpy.fromstring(signal, 'Int16');
print "signal = ", signal
testing = numpy.fft.fft(signal)
print "testing = ", testing
wf = wave.open(sys.argv[1], 'rb')
RATE = wf.getframerate()
p = pyaudio.PyAudio() # Instantiate PyAudio
# Open Stream
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# Read data
data = wf.readframes(CHUNK)
# Play Stream
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
frequency = pitch(data)
print "%f frequency" %frequency
我與在pitch
方法做什麼掙扎。我知道我需要對傳入的數據執行FFT,但我真的不確定如何執行此操作。
也應該用this函數?
你不確定什麼?看看這兩個函數的文檔。您是否在numpy.fft.fftfreq的文檔頁面上看到了該示例? http://www.dspguide.com/pdfbook.htm是一個很好的資源。 – wwii
本頁面上的示例顯示了一個長度爲8的數組。他們是如何得到8的長度的?我的塊大小是1024和2個通道,所以我的數組長度是2048. https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.fftpack.fftfreq.html#scipy.fftpack.fftfreq – Catfish
我會分別處理這兩個通道。 'np.fft.fft()'將返回一個與其輸入長度相同的複數值的數組 - 每個值表示一個頻率,複數的絕對值是該頻率的大小,該值的複數分量是其相移。 'np.fft.fftfreq()'返回一個數組,其中包含傅立葉變換返回的值的實際頻率。如果你想繪製頻譜'np.absolute(np.fft.fft(signal))'將是縱座標(y值),'np.fft.fftfreq(...)'是橫座標(x) 。 – wwii