C# 处理16位采样音频
现在我有一个音频文件(2个通道,44.1kHz采样率,16位采样大小,WAV),我想将其传递到这个方法中,但我不确定是否有任何方法可以将WAV文件转换为字节数组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)
/// <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文件读取数据的众多在线参考之一。