C# 处理16位采样音频

C# 处理16位采样音频,c#,audio,fft,C#,Audio,Fft,现在我有一个音频文件(2个通道,44.1kHz采样率,16位采样大小,WAV),我想将其传递到这个方法中,但我不确定是否有任何方法可以将WAV文件转换为字节数组 /// <summary> /// Process 16 bit sample /// </summary> /// <param name="wave"></param> public void Process(ref byte[] wave)

现在我有一个音频文件(2个通道,44.1kHz采样率,16位采样大小,WAV),我想将其传递到这个方法中,但我不确定是否有任何方法可以将WAV文件转换为字节数组

 /// <summary>
    /// Process 16 bit sample
    /// </summary>
    /// <param name="wave"></param>
    public void Process(ref byte[] wave)
    {
        _waveLeft = new double[wave.Length / 4];
        _waveRight = new double[wave.Length / 4];

        if (_isTest == false)
        {
            // Split out channels from sample
            int h = 0;
            for (int i = 0; i < wave.Length; i += 4)
            {
                _waveLeft[h] = (double)BitConverter.ToInt16(wave, i);
                _waveRight[h] = (double)BitConverter.ToInt16(wave, i + 2);
                h++;
            }
        }
        else
        {
            // Generate artificial sample for testing
            _signalGenerator = new SignalGenerator();
            _signalGenerator.SetWaveform("Sine");
            _signalGenerator.SetSamplingRate(44100);
            _signalGenerator.SetSamples(16384);
            _signalGenerator.SetFrequency(5000);
            _signalGenerator.SetAmplitude(32768);
            _waveLeft = _signalGenerator.GenerateSignal();
            _waveRight = _signalGenerator.GenerateSignal();
        }

        // Generate frequency domain data in decibels
        _fftLeft = FourierTransform.FFTDb(ref _waveLeft);
        _fftRight = FourierTransform.FFTDb(ref _waveRight);
    }
//
///处理16位样本
/// 
/// 
公共作废流程(参考字节[]波浪)
{
_Waveloft=新的双波长[波长/4];
_waveRight=新的双波长[波长/4];
如果(_isTest==false)
{
//从样本中分离出通道
int h=0;
对于(int i=0;i<波长;i+=4)
{
_waveloft[h]=(双)位转换器到nt16(波,i);
_waveRight[h]=(双)位转换器到NT16(波形,i+2);
h++;
}
}
其他的
{
//生成用于测试的人工样本
_信号发生器=新的信号发生器();
_信号发生器。设置波形(“正弦”);
_信号发生器。设置采样率(44100);
_信号发生器.设置样本(16384);
_信号发生器。设置频率(5000);
_信号发生器。设置振幅(32768);
_waveloft=_signalGenerator.GenerateSignal();
_waveRight=_signalGenerator.GenerateSignal();
}
//以分贝为单位生成频域数据
_fftLeft=fourier变换.FFTDb(参考小波);
_fftRight=FourierTransform.FFTDb(ref\u waveRight);
}
编辑您好,很抱歉造成混淆。我目前还不熟悉音频信号,所以我对可能会得到的结果的解释是错误的。为了使此方法正常工作,我相信我只需要在wav文件中传入数据块的字节数组。最终的结果是对其应用fft,如代码所示,并将其转换为频谱图。谢谢。

您需要:

using System.IO;
这段代码用于获取字节数组

byte[] data = File.ReadAllBytes(PathToFile);
其中
PathToFile
.wav
文件的位置(作为字符串)

编辑:

现在我有一个音频文件(2个通道,44.1kHz采样率,16位采样大小,WAV),我想将其传递到这个方法中,但我不确定是否有任何方法可以将WAV文件转换为字节数组

他要求使用一个函数从.wav文件中获取字节数组,但他没有说要获取包含音乐数据的字节数组的特定部分。
正确答案是..

这将读取完整的文件,带有RIFF头和其他内容。我想问题是关于处理WAV文件中的音频数据。对不起,他问如何将.WAV文件转换为字节数组。而不是如何获取数据块…Sry以避免混淆。我对你的答案投了赞成票,因为你给出的例子是我“最初”想问的。你可能想看看这个Hi,谢谢你的参考。我看了一下,发现我假设只检索包含数据块的字节数组。在旁注中,该示例返回了一个double。如何将其更改为字节数组以将其传递到我的方法中。如果我在任何地方出错,请纠正我。请尝试libsoundfile或解释如何从wav文件读取数据的众多在线参考之一。