首页 / 知识
关于音频:如何分析PCM或WAV样本的基频?
2023-04-15 12:06:00

How do you analyse the fundamental frequency of a PCM or WAV sample?我有一个样本保存在DirectX的缓冲区中。 这是从乐器弹奏和捕获的音符样本。 如何分析采样的频率(就像吉他调音器一样)? 我相信涉及FFT,但是我没有指向HOWTO的指针。 FFT可以帮助您确定频率在哪里,但不能准确告诉您频率是多少。 FFT中的每个点都是一个"频率"频率,因此,如果FFT中存在一个峰值,您所知道的就是您想要的频率在该频率或频率范围内。 如果您希望它真正准确,则需要具有高分辨率的长FFT和大量的bin(=大量的内存和大量的计算)。您还可以在对数标度频谱上使用二次插值,从低分辨率FFT中猜测出真正的峰值,效果令人惊讶。 如果计算成本最为重要,则可以尝试将信号转换为可以计数零交叉的形式,然后计数越多,测量越准确。 但是,如果缺少基本原理,这些方法都将无法工作。 :) 我在这里概述了几种不同的算法,并且内插FFT通常是最精确的(尽管仅在基波是最强谐波时才有效-否则,您需要更聪明地找到它),并且零交叉点接近第二(尽管这仅适用于每个周期有一个交叉的波形)。这些条件都不是典型的。 请记住,在许多乐器(例如钢琴或吉他)中,高于基本频率的部分不是完美的谐波。每个部分实际上有点失调或不和谐。因此,FFT中的高频峰值将不完全位于基频的整数倍上,并且波形将从一个周期到下一个周期稍有变化,这会导致自相关。 为了获得真正准确的频率读数,我会说要使用自相关来猜测基频,然后使用二次插值找到真实的峰值。 (您可以在频域中进行自相关以节省CPU周期。)有很多陷阱,正确的使用方法实际上取决于您的应用程序。
还有其他基于时间的算法,而不是基于频率的算法。 我已经编写了自相关的c#实现和其他可读的算法。查看http://code.google.com/p/yaalp/。
http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio (该项目是GPL;因此,如果您使用该代码,请理解这些术语)。 吉他调音器不使用FFT或DFT。通常他们只算零交叉。您可能无法获得基本频率,因为某些波形比其他波形具有更多的零交叉,但通常可以这样获得基本频率的倍数。尽管您可能会掉一个或多个八度音,但这足以获得音符。 在对零交叉计数之前,低通滤波通常可以消除多余的零交叉。调整低通滤波器需要了解一些您想要检测的频率范围 确实会涉及FFT(快速傅立叶变换)。 FFT使您可以用固定频率和幅度变化的简单正弦波之和来近似任何模拟信号。实际上,您要做的是获取一个样本并将其分解为幅度->频率对,然后获取与最高幅度相对应的频率。 希望其他SO读者可以填补我在理论和代码之间留下的空白! 具体来说: 如果从输入阵列中的原始PCM开始,基本上就是波幅与时间的关系图,执行FFT会将其转换为输入采样率从0到1/2的频率直方图。结果数组中每个条目的值将是相应子频率的"强度"。 因此,以给定的大小为N的输入数组(以S个样本/秒为样本),找到根频率:
检索PCM音频信号中的基频是一项艰巨的任务,并且有很多要讨论的地方...
无论如何,通常基于时间的方法不适合用于复音信号,因为由多个基频导致的不同谐波分量之和给出的复波具有零交叉率,该交叉率仅取决于最低频率分量。 一种更合适的方法是恒定Q变换,它是在对信号进行2次低通滤波和抽取(即将采样频率的每一步减半)后进行DFT滤波,以便获得具有不同频率的不同子带解析度。这样,DFT的计算得以优化。问题在于时间分辨率也是可变的,并且对于较低的子带会增加... 最后,如果我们试图估计单个音符的基本频率,则FFT / DFT方法是可以的。在复音环境中,事物发生了变化,其中不同声音的部分重叠并根据其相位差求和/取消幅度,因此单个频谱峰值可能属于不同的谐波含量(属于不同的音符)。在这种情况下,相关性不会给出良好的结果... 应用DFT,然后从结果中得出基本频率。搜寻DFT信息将为您提供所需的信息-我会将您链接到一些信息,但是它们对数学知识的期望差异很大。 祝好运。 |
最新内容
相关内容
linux显存频率命令?
linux显存频率命令?,情况,系统,信息,工具,工作,命令,环境,数字,电脑,发行,查看linux电脑gpu的参数linux怎么查看gpu使用情况?我们一起来了解一linux命令行提取音频?
linux命令行提取音频?,地址,工作,系统,信息,命令,标准,目录,手机,工具,数据,Linux常用命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出查看linux频率命令?
查看linux频率命令?,系统,信息,第一,实时,工作,数据,地址,命令,分析,文件,linux系统下怎么检查cpu频率?1、sar命令是一个Linux系统监控命令,可linux关闭音频命令行?
linux关闭音频命令行?,状态,系统,时间,数据,命令,文件,标准,电脑,手机,首页,linux打开文件后怎么保存关闭,急急急!!!(在命令行里)1、你如果没Python文件的指针定位与查询
Python文件的指针定位与查询,位置,培训,文件,指针,字节,选项,头部,当前位置,表示,方式,1、文件指针:文件被打开后,其对象保存在f中,它会记住文件pythonpython中有指针吗
pythonpython中有指针吗,入口,地址,培训,位置,标准,代码,函数,指针,对象,变量,Python对指针做了良好封装,一切都是“对象”,一切对象都有一个“C++中指针变量与引用变量的区别是
C++中指针变量与引用变量的区别是什么?,C++中指针变量与引用变量的区别是什么?,引用,读写,句法,糖分,What are the differences betweeC ++删除指向指针的指针
C ++删除指向指针的指针,C ++删除指向指针的指针,删除,指针,指针数组,那会,C++ deleting a pointer to a pointer所以我有一个指向指关于音频:Ruby中的波形可视化
关于音频:Ruby中的波形可视化,关于音频:Ruby中的波形可视化,项目,很好,该项目,音频文件,Waveform Visualization in Ruby我将要开始一关于C#:导出QTMovie的最佳方法,音频
关于C#:导出QTMovie的最佳方法,音频中具有淡入和淡出,关于C#:导出QTMovie的最佳方法,音频中具有淡入和淡出,音频,淡入,淡出,我想,Best wa使用PHP的GDlib imagecopy重新采样
使用PHP的GDlib imagecopy重新采样时,能否保留PNG图像的透明度?,使用PHP的GDlib imagecopy重新采样时,能否保留PNG图像的透明度?,调整,关于 c#:如何让 PictureBox 使用最
关于 c#:如何让 PictureBox 使用最近邻重采样?,关于 c#:如何让 PictureBox 使用最近邻重采样?,调整,拆分,默认,平滑,How do I make a P