我正在尝试创建一个带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