【问题标题】:Convert Audio samples from bytes to complex numbers?将音频样本从字节转换为复数?
【发布时间】:2013-03-01 23:42:57
【问题描述】:

大家好,

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

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

干杯,谢谢!

乔什

【问题讨论】:

  • 你能解释一下你所说的“转换”是什么意思吗?例如,0x78 的复数等价物是什么? 7 + 8i?您的问题真的是关于转换还是关于信号处理?
  • 如果您为我们绝大多数未参与信号处理的人澄清问题,这可能会有所帮助。例如,让我们暂时将数组放在一侧。您是在问如何将字节转换为复数?是否只是要设置的实数部分,剩余的虚数 0?
  • 我可能最终会在另一篇文章中问另一个问题......我也不熟悉信号处理,并且很难找到一些算法中的数字来自哪里......但随着这个问题的出现,我正在寻找转换。例如,一个具有 5 个值的字节数组:115、255、49、85 和 145。我见过人们转换此数据的许多不同方式(来自音频样本)。一个是使用 BitConverter 将字节转换为双精度......简单的双重转换((双)字节[1])......然后在这篇文章的第一个答案中使用下面的方法..
  • 然后每个都将双精度数转换为复数。我只是找不到使用其中一个的原因背后的任何明确解释。这就是问题所在。

标签: c# silverlight silverlight-4.0


【解决方案1】:

CodeProject 上的This project 可能对您有用,因为它在 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% 准确的,但我不知道它的性能如何。如果这成为一个问题,您可能需要重构。

【讨论】:

  • 这种方法让我更接近我期望的数字。虽然,像你一样,我想知道他在他的算法中提出 32768 的地方:/
  • 你有没有发现这是否适用于所有复数?我想 32768 来自 int16 值(256 * 128)。
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 2017-08-21
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多