将音频样本从字节转换为复数?

问题描述 投票:0回答:2

大家好,

我目前正在使用 C# 后端在 Silverlight 中开发用于乐器/语音的半音调谐器。我正处于起步阶段,在获取音频数据时遇到问题。当实时捕获开始时,我正在使用 AudioSink 类将音频写入内存流。我遇到的问题是将流中的那些字节转换为复数,以便可以将其输入 FFT 算法。我已经尝试了这篇文章中讨论的各种方法将字节数组转换为双精度问题但我不确定应该使用哪种方法。

关于从字节数组到复数数组的任何建议?准确性和速度是必须的(比速度更准确),因为我项目的后期阶段将实时执行此过程,以便在声音进入时显示正在播放的音高。

干杯和感谢!

乔希

c# silverlight silverlight-4.0
2个回答
1
投票

CodeProject 上的这个项目 可能对您有用,因为它使用 C# 并通过 Cooley-Turkey FFT 算法处理音频。

如果你不想筛选这里是复数位的字节:

byte[] data = yourByteArray;
double[] x = new double[data.Length];
for (int i = 0; i < x.Length; i++)
{
    x[i] = data[i] / 32768.0;
}
ComplexNumber[] data = new ComplexNumber[length];
for (int i = 0; i < x.Length; i++)
{
    data[j] = new ComplexNumber(x[i]);
}

我不太了解声音处理,所以不知道除以 32768 是这个解决方案独有的还是一般情况下都是如此。

此外,虽然这将是 100% 准确的,但我不知道它的表现如何。如果这成为一个问题,您可能需要重构。


0
投票

byte 范围通常为 0-255 和 double 范围 -1 到 1。 将字节转换为双精度并将字节值缩放为 -1..1,它将每个字节除以 32768.0,相当于除以 2^15.

© www.soinside.com 2019 - 2024. All rights reserved.