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 - 获取所有频率的幅度的主要内容,如果未能解决你的问题,请参考以下文章

从波形文件中获取频率和幅度

DSP FFT基频wav文件

NAudio FFT 返回所有频率的小而相等的幅度值

2020-10-07 Librosa 音频处理初学的几点迷思

iPhone:检测特定频率(幅度)的复制声音

使用 GLSL 进行频率调制?