DSP:音频处理:squart还是登录以利用fft?

时间:2013-11-18 21:02:26

标签: python audio numpy signal-processing fft

上下文:

我正在发现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 +值))

哪一个最好?

SUM UP:

我想对我的阵列进行傅立叶分析,但这两个答案中的任何一个似乎只强调信号而不是隔离组件。

我可能错了,我还是个菜鸟。

那我该怎么做呢?

谢谢,

更新:

我问这个问题: DSP - get the amplitude of all the frequencies与此相关。

2 个答案:

答案 0 :(得分:2)

你的问题似乎很混乱,但你显然已经尝试了一些东西,这很棒。让我退后一步,为您提出一条总体路线:

  • 首先将音频分成几个大小的块,比如N.
  • 对每个N个样本块执行FFT。
  • 然后担心将数据显示为RMS(平方逼近)或dB(基于ln的方法)。

实际上,您可以将这些值视为显示的缩放因子。

如果您需要有关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)

我相信您的采样率是频率。

相关问题