我正在发现DSP的广阔领域。是的,我是初学者。
在audiolab给出的音频阵列上应用fft,以获得不同的信号频率。
一个问题:由于audiolab,我无法理解如何处理包含音频数据的numpy数组。 :
import numpy as np
from scikits.audiolab import Sndfile
f = Sndfile('first.ogg', 'r')
# Sndfile instances can be queried for the audio file meta-data
fs = f.samplerate
nc = f.channels
enc = f.encoding
print(fs,nc,enc)
# Reading is straightfoward
data = f.read_frames(10)
print(data)
print(np.fft.fft(data))
现在我有了我的数据。
我在这里阅读了这两篇好文章:
Analyze audio using Fast Fourier Transform(接受的答案很精彩)
和
http://www.onlamp.com/pub/a/python/2001/01/31/numerically.html?page=2
现在有两个技术:显然一个建议方形(第一个链接)而另一个建议日志,尤其是:10ln10(绝对值(1.10 ** - 20 +值))
哪一个最好?
我想对我的阵列进行傅立叶分析,但这两个答案中的任何一个似乎只强调信号而不是隔离组件。
我可能错了,我还是个菜鸟。
那我该怎么做呢?
谢谢,
我问这个问题: DSP - get the amplitude of all the frequencies与此相关。
答案 0 :(得分:2)
你的问题似乎很混乱,但你显然已经尝试了一些东西,这很棒。让我退后一步,为您提出一条总体路线:
实际上,您可以将这些值视为显示的缩放因子。
如果您需要有关FFT本身的帮助,我的博客文章中关于使用FFT进行音高检测可能有所帮助:http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html
答案 1 :(得分:0)
添加@Bjorn Roche给出的答案。
这是一个使用dB刻度绘制频谱的简单代码。 它使用matplotlib进行绘图。
import numpy as np
import pylab
# for a real signal
def plotfftspectrum(signal, dt): # where dt is the sample rate
n = signal.size
spectrum = np.abs(np.fft.fft(signal))
spectrum = 20*np.log(spectrum/spectrum.max()) # dB scale
frequencies = np.fft.fftfreq(n, dt)
pylab.plot(frequencies[:n//2], spectrum[:n//2])
# plot n//2 due real function symmetry
pylab.show()
您可以在读取至少一些数据样本后使用它,例如1024。
data = f.read_frames(1024)
plotfftspectrum(data, 1./f.samplerate)
我相信您的采样率是频率。