DSP - 获取所有频率的幅度

时间:2013-11-19 18:07:33

标签: python audio numpy signal-processing fft

这个问题与以下内容有关: DSP : audio processing : squart or log to leverage fft?

我迷失了选择正确的算法。

现在,

目标:

我想得到我的信号的所有频率,我从音频文件中得到。

上下文:

我使用numpy和scikits.audiolab。我在dsp主题上做了很多阅读,也去了dspguru.com,通过网络阅读论文和漂亮的博客。

我使用的代码就是这个:

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.rfft(data))

我是DSP的新手。

我的问题

我希望能够分离信号的所有频率,以比较不同的信号。 我在声音数组上使用numpy.fft.rfft;但是现在,仅此一项行动是不够的。那么,正确获得所有频率的最佳解决方案是什么?

我看到,将结果值相乘得到复数,并将整数转换为实数。

现在请问什么?是吗?

如果你需要我澄清任何事情,请问。

非常感谢!

3 个答案:

答案 0 :(得分:2)

数学傅立叶变换在使用函数*exp(-i*omega*t)进行变换时返回复数值。因此,PC为您提供与余弦和正弦变换相对应的复数。为了获得幅度,您只需要取绝对值:np.abs(spectrum)。为了得到功率谱平方的绝对值。复杂表示很有价值,因为您不仅可以获得振幅,还可以获得频率的相位 - 这在DSP中也很有用。

答案 1 :(得分:2)

  • 你说“我想得到我的信号的所有频率,我从音频文件中得到。”但你真正想要的是频率的大小。

  • 在你的代码中,看起来(我不知道python)你只读了前10个样本。假设你的文件是单声道的,那很好,但你可能想看一组更大的样本,比如1024个样本。当你这样做时,你会想要重复下一组N个样本。您可能想要也可能不想重叠样本集,并且您可能想要应用窗口函数,但您在此处所做的是一个良好的开端。

  • 沉睡者说的是真的。 fft的输出很复杂。要找到给定频率的大小,您需要找到复数的长度或绝对值,它只是sqrt(r ^ 2 + i ^ 2)。

答案 2 :(得分:0)

如果我做对了,你想要遍历所有数据(声音)和捕获幅度,这样就可以在每次1024个样本的数据捕获时“暂时”

data = f.read_frames(1024)

while data != '':
    print(data)
    print(np.fft.rfft(data))
    data = f.read_frames(1024)