声音样本的数学分析(作为数字数组)

Dav*_*lds 11 vb.net audio audio-analysis

我需要找到一个样本的频率,存储(在vb中)作为一个字节数组.样本是一个正弦波,已知频率,所以我可以检查),但数字有点奇怪,我的数学foo很弱.全系列值0-255.99%的数字在235到245的范围内,但有一些异常值降至0和1,其余1%则高达255.如何对此进行归一化以去除异常值(计算235-245间隔,因为它可能随着不同的样本而变化),以及如何计算过零点以获得频率?如果这个描述是垃圾,请道歉!

ASh*_*lly 7

FFT可能是最好的答案,但如果您真的想通过您的方法来做,请尝试以下方法:

要进行标准化,首先要制作一个直方图来计算从0到255的每个值的出现次数.然后从每个端点丢弃X%的值,例如:

for (i=lower=0;i< N*(X/100); lower++)
  i+=count[lower];
//repeat in other direction for upper
Run Code Online (Sandbox Code Playgroud)

现在正常化

A[i] = 255*(A[i]-lower)/(upper-lower)-128
Run Code Online (Sandbox Code Playgroud)

抛弃-128..127范围之外的结果.

现在你可以计算零交叉点.为了确保您不会受到噪音的愚弄,您可能希望跟踪最后几个点的斜率,并且仅在平均斜率正确的情况下计算交叉点.


Tyl*_*ler 5

解决这个问题的标准方法是考虑一个数据块,希望至少是实际频率的两倍(获取更多数据也不错,所以高估一点是好的),然后采用FFT并猜测频率对应得到的FFT频谱中的最大数字.

顺便说一下,之前已经问过非常类似的问题 - 你也可以搜索这些答案.