【发布时间】:2011-04-08 01:56:15
【问题描述】:
我目前有一个充满数据的数组,我认为这些数据是我的波形文件的振幅。目前处于低位-32768,高位32767。
我也有 16,000hz 的 SampleRate。
我对声音的理解不是很好;有谁知道我如何计算频率?
帮助不胜感激,
猴哥。
【问题讨论】:
标签: algorithm math signal-processing
我目前有一个充满数据的数组,我认为这些数据是我的波形文件的振幅。目前处于低位-32768,高位32767。
我也有 16,000hz 的 SampleRate。
我对声音的理解不是很好;有谁知道我如何计算频率?
帮助不胜感激,
猴哥。
【问题讨论】:
标签: algorithm math signal-processing
虽然录音确实没有单一频率,但您可以很容易地找到基频。从样本的开头开始,并跟踪它;您正在寻找最高的绝对值,并且在具有多个频率的波中,您将不知道它是什么,直到您回到零。记住迄今为止您看到的最高或最低值。现在,向前追溯,希望是相反的方向。您正在使用与以前相同的方法寻找与您找到的绝对值相似的下一个峰值或谷值。找出两个最高绝对值读数之间有多少样本。将采样率除以这个数字(最好不要为零),然后除以 2。这是此时录音的最低或基本频率。
您还可以生成一个正弦函数来表示给定频率的合成波形,然后从样本中减去该波形的瞬时值。找出前后样本的均方根幅度的差异。这种差异是该频率下信号幅度的粗略近似值。重复这个过程,每次加倍频率。您可以使用它来创建基本的 EQ 频谱。
【讨论】:
您到底想要做什么?该方法将完全取决于您希望实现的目标。您是否有包含单个正弦曲线的信号,例如来自机械设备的检测器?或者更有可能,您是否想对着麦克风播放/唱歌并转录音乐?
在这两种情况下,FFT 都是您的第一个停靠港。在第一种情况下,这几乎就是您所需要的,因为 FFT 非常适合隔离的稳态正弦曲线。在后一种情况下,要获得任何有用的结果,您还有很长的路要走。音高识别是一个难题,仅仅抛出一些 FFT 不会让你走得很远。您需要在数字信号处理以及音乐信号的特性方面有良好的基础,然后您最好的选择可能是使用基于自相关的方法。
有关一些可能有用的链接,请参阅我之前对相关主题的回答:Algorithms for determining the key of an audio sample
【讨论】:
几乎在所有情况下,音频文件都没有单一频率。声波具有单一频率的声音,(通常)是纯正弦音,听起来像这样:
http://www.wolframalpha.com/input/?i=sound+440+Hz&a=*MC.~-_*PlaySoundTone-&a=*FS-_**DopplerShift.fo-.*DopplerShift.vs-.*DopplerShift.c--&f3=10+m/s&f=DopplerShift.vs_10+m/s&f4=340.3+m/s&f=DopplerShift.c_340.3+m/s&a=*FVarOpt.1-_***DopplerShift.fo-.*DopplerShift.fs--.***DopplerShift.DopplerRatio---.*--&a=*FVarOpt.2-_**-.***DopplerShift.vo--.**DopplerShift.vw---.**DopplerShift.fo-.*DopplerShift.fs---
这是一个纯 440 Hz 正弦波。 (由于 MarkDown 的限制,无法建立正确的链接。)
一般声音,例如(语音、音乐或只是城市噪音的)录音,由叠加的(无数个)此类正弦波组合组成。也就是说,如果您要绘制波的压力与时间(在空间中的给定点)的关系图,或者(或多或少)等效地,将扬声器膜的位置作为时间的函数,它会因此不是a pure sine wave,而是更复杂的东西。 (确实,贝多芬交响曲的所有信息怎么能用一个简单的正弦波来表示,完全由它的频率决定,一个数字?)
数字录音的采样率仅仅是声波每秒的采样数。实际上,物理声波每次都有一个幅度 p(t),所以,因为在 0 s 和 10 s 之间有无限次 t(比如说),理论上,为了保存音频,我们需要无限次字节数(每个样本需要固定数量的字节——例如,16 位记录每个样本使用 16 位或 2 个字节——当然,“位数”越高,我们得到的质量就越高; 对于 16 位声音,我们在指定单个样本时有 216 = 65536 个级别可供选择)。在实践中,对声音进行采样,因此仅以固定间隔保存幅度 p(t)。例如,典型的音频 CD 的采样率为 44.1 kHz;也就是说,每 22.7 µs 保存一个样本。
因此,任何频率的纯正弦波或任何记录都可以使用任何采样率存储在计算机上,记录的质量由采样率决定(越高越好)。 [技术说明:采样率当然有一个下限(在某种意义上)。这称为Nyquist rate。]
要确定声音在任何小时间的平均频率,您可以使用Fourier analysis 中的一些高级技术,但这并非完全无关紧要。
【讨论】:
作为其他两个答案的快速附录,如果您正在尝试测量声音文件本身中的频率,则需要查看 Fast Fourier Transform (FFT),这是一个用于确定采样数据集中频率强度的算法。
【讨论】:
这只是我记忆中的物理知识,我也绝对不是音乐专家。
除非它是一个恒定音调的录音,否则它可能没有单一频率。每种音调都有不同的频率,这就是它们听起来不同的原因。波(不是 wav)的频率和波长之间通常存在关系,但我不知道关于幅度。
您的 SampleRate 类似于一个频率,以Hz 衡量,但它只告诉您录音的精度,而不是录音的实际频率。
【讨论】: