这个问题与以下内容有关: 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;但是现在,仅此一项行动是不够的。那么,正确获得所有频率的最佳解决方案是什么?
我看到,将结果值相乘得到复数,并将整数转换为实数。
现在请问什么?是吗?
如果你需要我澄清任何事情,请问。
非常感谢!
答案 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)