DSP - 获取所有频率的幅度
Posted
技术标签:
【中文标题】DSP - 获取所有频率的幅度【英文标题】:DSP - get the amplitude of all the frequencies 【发布时间】:2013-11-19 18:07:33 【问题描述】:这个问题与: 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;但是现在,仅靠这个操作是不够的。那么,正确获取所有频率幅度的最佳解决方案是什么?
我看到将结果值相乘可以去掉复数并将整数转换为实数。
现在请教什么?是这样吗?
如果你需要我澄清什么,尽管问。
非常感谢!
【问题讨论】:
DSP : audio processing : squart or log to leverage fft?的可能重复 不,不是:我的另一个问题与采用 log 或 sqrt 的最佳方程式有关。这与幅度的整体提取有关,因为我理解这是两件不同的事情。 【参考方案1】:您说“我想从音频文件中获取信号的所有频率。”但你真正想要的是频率的大小。
在您的代码中,看起来(我不知道 python)您只阅读了前 10 个样本。假设您的文件是单声道的,那很好,但您可能希望查看更大的样本集,例如 1024 个样本。一旦你这样做了,当然,你会想要在下一组 N 个样本上重复。您可能想要也可能不想重叠样本集,并且您可能想要应用窗口函数,但您在这里所做的是一个好的开始。
瞌睡虫说的是真的。 fft 的输出很复杂。要找到给定频率的大小,您需要找到复数的长度或绝对值,即 sqrt( r^2 + i^2 )。
【讨论】:
在 Python 中,您只需调用abs(complex_num)
即可获取幅度。【参考方案2】:
数学傅立叶变换返回复数值,因为它是使用函数*exp(-i*omega*t)
进行的变换。因此,PC 将频谱作为对应于余弦和正弦变换的复数提供给您。为了获得幅度,您只需要取绝对值:np.abs(spectrum)
。为了得到功率谱平方的绝对值。复杂表示很有价值,因为您不仅可以获得幅度,还可以获得频率的相位 - 这在 DSP 中也可能很有用。
【讨论】:
+1 - 唯一的问题是我不能同时给 Sleepyhead 和 Bjorn 一个正确的答案,因为他们互相补充!谢谢一百万【参考方案3】:如果我做对了,你想要遍历所有数据(声音)并捕获幅度,因为这会在每次 1024 个样本时对数据捕获进行“一段时间”
data = f.read_frames(1024)
while data != '':
print(data)
print(np.fft.rfft(data))
data = f.read_frames(1024)
【讨论】:
以上是关于DSP - 获取所有频率的幅度的主要内容,如果未能解决你的问题,请参考以下文章