Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将话筒输入中的NAudio波从8000 kHz重新采样至44100 kHz_C#_Naudio_Resampling - Fatal编程技术网

C# 将话筒输入中的NAudio波从8000 kHz重新采样至44100 kHz

C# 将话筒输入中的NAudio波从8000 kHz重新采样至44100 kHz,c#,naudio,resampling,C#,Naudio,Resampling,我正在为我的学生编写教育音乐应用程序 我需要将音频输入传递到pitchAnalyzer;它在44100取样器上运行良好,但在8000取样器上显示错误结果 我读了很多例子:如何读写文件。但我没有文件要读,也不需要写音频 我已经完成了从16位字节数组到IEEE浮点(pitchAnalyzer算法所需的格式)的转换,该转换随WaveInOnDataAvailable事件而来 void WaveInOnDataAvailable(object sender, WaveInEventArgs waveIn

我正在为我的学生编写教育音乐应用程序

我需要将音频输入传递到pitchAnalyzer;它在44100取样器上运行良好,但在8000取样器上显示错误结果

我读了很多例子:如何读写文件。但我没有文件要读,也不需要写音频

我已经完成了从16位字节数组到IEEE浮点(pitchAnalyzer算法所需的格式)的转换,该转换随WaveInOnDataAvailable事件而来

void WaveInOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)

var buffer = waveInEventArgs.Buffer;
float[] samples = new float[buffer.Length/2];       

for (int n = 0; n < buffer.Length; n += 2)
{
    samples[n / 2] = BitConverter.ToInt16(resampled_buffer, n) / 32768f;
}
  • 那么,如何在不将其写入文件的情况下将其直接重采样到缓冲区

  • 有没有办法改变输入采样器中的波形?属性显示它无法设置,但可能还有其他方法


  • 提前非常感谢

    每44100/8000个周期手动读取一次数据,并将其平均化为一个样本?大致读入5个样本,求平均值并保存到缓冲区,读入6个样本,求平均值并保存到缓冲区,重复?据我所知,您的意思是手动执行插值。这应该是可行的,但我知道有几种算法可以实现它,包括抗锯齿。如果不读写文件,我就找不到他们使用的代码。你能不能把整个文件读入缓冲区,完成工作,然后一次全部写下来(或者直接使用它跳过写)?我假设您正试图对抗大量影响性能的小型读/写操作,但如果这不正确,请纠正我。我还要补充一点,似乎有相当多的开源项目使用naudio,这可能会在实际操作中向您展示您正试图实现的目标。1)这就是重点:我不从文件中读取音频数据。我从麦克风上得到缓冲器。对于大多数“重采样器”——它们确实从文件中读取数据,它们需要在接口中输入文件。2) 我不把音频读入文件。同样,我在示例中看到的所有重采样器等都使用输出文件。我没有,我需要把它传给pitchAnalyzer,这是程序的一部分。3) 问题是:如何使用“重采样器”避免文件读写。或者,如果有一种方法可以模拟文件的读写,那么就以一种巧妙的方式使用它们。
    waveIn = new WaveIn();
    waveIn.DeviceNumber = comboBx_RecordingDevices.SelectedIndex;  
    waveIn.DataAvailable += WaveInOnDataAvailable;
    waveIn.StartRecording();