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

我需要找到一个样本的频率,存储(在vb中)作为一个字节数组。样本是一个正弦波,已知频率,所以我可以检查),但数字有点奇怪,我的数学foo很弱。 全系列值0-255。 99%的数字在235到245之间,但有一些异常值降至0和1,其余1%则高达255。 如何对此进行归一化以去除异常值(计算235-245间隔,因为它可能随着不同的样本而变化),以及如何计算过零点以获得频率? 如果这个描述是垃圾,请道歉!     
已邀请:
FFT可能是最好的答案,但如果您真的想通过您的方法来做,请尝试以下方法: 要进行标准化,首先要制作一个直方图,以计算从0到255的每个值的出现次数。然后从每个端点丢弃X%的值,例如:
for (i=lower=0;i< N*(X/100); lower++)
  i+=count[lower];
//repeat in other direction for upper
现在正常化
A[i] = 255*(A[i]-lower)/(upper-lower)-128
抛弃-128..127范围之外的结果。 现在你可以计算过零点。为了确保您不会受到噪音的愚弄,您可能希望跟踪最后几个点的斜率,并且仅在平均斜率正确的情况下计算交叉点。     
解决这个问题的标准方法是考虑一个数据块,希望至少是实际频率的两倍(获取更多数据也不错,所以高估一点是好的),然后采用FFT并猜测频率对应得到的FFT频谱中的最大数字。 顺便说一下,之前已经提出过非常类似的问题 - 您也可以搜索这些答案。     
使用傅立叶变换,它比计算零交叉更加噪声不敏感 编辑:@WaveyDavey 我找到了一个F#库来做FFT:从这里开始   事实证明,最好的免费   我为F#找到的实现   到目前为止用户仍然是太棒了   FFTW库。他们的网站有一个   预编译的Windows DLL。我写过   最小的绑定允许   从F#线程安全访问FFTW,   同时拥有大师和简单的界面。   性能非常出色,32位   Windows XP Pro仅高达35%   比64位Linux慢。 现在我确定你可以从VB.net,C#等调用F#lib,这应该在他们的文档中     
如果我从你的描述中理解得很好,你所拥有的是一个信号,它是一个正弦加一个常数加上一些随机故障的组合。说,就像
x[n] = A*sin(f*n + phi) + B + N[n]
其中N [n]是你要摆脱的“小故障”噪音。 如果毛刺是单样本长,则可以使用中值滤波器去除它们,中值滤波器必须大于毛刺长度。在故障的两边。长度为1的毛刺意味着你将有足够的中位数为3个长度的样本。
y[n] = median3(x[n])
计算中位数是这样的:取你想要过滤的x的样本(x [n-1],x [n],x [n + 1]),对它们进行排序,输出是中间的。 现在噪声信号消失了,摆脱了恒定信号。我知道缓冲区的长度有限且已知,因此您只需计算整个缓冲区的平均值即可。减去它。 现在你有了单个窦信号。您现在可以通过计算过零点来计算基频。计算前一个样本低于0的样本数量。该时间段是缓冲区样本的总量除以此值,频率是该时间段的对数(1 / x)。     
虽然我会与大多数人一起说,看起来你想要的是一个fft解决方案(fft算法非常快),如果fft不是任何理由的答案,你可能想尝试使用正弦曲线拟合数据一个合适的程序并读取拟合的频率。 使用Fityk,您可以加载数据,并适合
a*sin(b*x-c)
,其中
2*pi/b
将为您提供拟合后的频率。 Fityk可以从gui,脚本命令行使用,也可以使用C ++ API,因此可以直接包含在程序中。     
我用Google搜索“基本fft”。 Visual Basic FFT你的问题尖叫FFT,但要小心,使用FFT而不了解一点关于DSP可能导致你不理解或不知道它们来自哪里的结果。     
在http://www.relisoft.com/Freeware/index.htm上获取频率分析器并运行它并查看代码。     

要回复问题请先登录注册