C# C语言中的音频节拍检测#

C# C语言中的音频节拍检测#,c#,C#,使用.NET mscorlib程序集中的System.IO BinaryReader对象,我运行了一个循环,将.wav文件中的每个字节值转储到Excel电子表格中。为了简单起见,我将一个两秒钟的4K信号从信号发生器记录到软件sequencer中,并保存为单声道波形文件。软件I sequence music的分辨率为1ms,即44.11个采样(假设采样率为44.1K)。我感到奇怪的是,通过ReadInt16()方法提取的数据(从.wav文件中的位置44开始)显示了各种数字,其中整数似乎随机切换符号

使用.NET mscorlib程序集中的System.IO BinaryReader对象,我运行了一个循环,将.wav文件中的每个字节值转储到Excel电子表格中。为了简单起见,我将一个两秒钟的4K信号从信号发生器记录到软件sequencer中,并保存为单声道波形文件。软件I sequence music的分辨率为1ms,即44.11个采样(假设采样率为44.1K)。我感到奇怪的是,通过ReadInt16()方法提取的数据(从.wav文件中的位置44开始)显示了各种数字,其中整数似乎随机切换符号,而sequencer中的可视正弦波在振幅和频率方面是完全一致的。对于16位分辨率,我确定每个样本的第一个字节是频率分辨率,第二个振幅,对吗

问:我如何才能智能地解释从波形文件中提取的整数,以最终确定节拍


非常感谢……….Mickey

对于每个样本16位的WAV文件,样本的第一个字节不是频率分辨率,第二个字节是振幅。这两个字节一起表示该特定时间点的样本振幅。这两个字节被解释为2字节整数,因此值的范围为-32768到+32767


我不知道你的音序器是如何工作的,也不知道它显示了什么。根据您的描述,听起来好像您的音序器正在使用FFT将音频从时域(即WAV文件)转换为频域(即频率沿x轴和频率振幅沿y轴的图形)。WAV文件不包含频率信息。

好的,我知道了。从2字节的输出分组来看,第一个字节的值通常比2字节的值高得多,因此我得出了一个错误的结论,即这是一个频率/振幅指定。因此,是否有某种图例或映射文档来解释逻辑。如果二进制读取器输出数据的范围为位置1的-32768到32767,即字节1,那么字节2的用途是什么?@Mickey:否,每个样本2个字节意味着每个样本的值(每秒44100个样本)存储为两字节整数(aka
Int16
)。
Int16
的可能值范围为-32768到+32767。您似乎认为示例中的两个字节中的每一个都存储了不同数量的数据,而事实并非如此。这两个字节基本上是作为单个
Int16
绑定在一起的。因此,我创建了一个1秒的mono.wav文件,其中音频数据块包含88200个字节。当我向下滚动这个88200输出列表时,我看到了像…29570750,-296581305。。。在这种类型的高/低序列中。如果88200个位置中的每个位置都是1字节的数据,则需要两个位置来构成采样分辨率。还是我在这里遗漏了什么?如果是这样,那么在这个双序列的每个实例中,第二个字节的意义是什么?您不需要添加它们。它是一个16位(2字节)长的数字。如果我写“6458”,那是六千四百五十八,而不是一百二十二!(64+58),对吗?负数只是对每个双字节数的一部分的错误解释。有点像认为“23”在偶数的“2392”中是奇数,因为你只看到了一半。谢谢你,希恩德尔,我会看一下文档。为了回答您的问题,是的,我只是调用ReadInt16方法来提取十进制整数值。