C# wav音频怎么把数据转换成时域图 频域图 和能量图
时间: 2024-09-19 18:13:35 浏览: 152
在C#中,要将WAV音频文件的数据转换成时域图、频域图(即频率谱图)和能量图,你需要使用NuGet包如NAudio或WaveSharp,它们提供对音频文件操作的支持。以下是基本步骤:
1. **读取WAV音频数据**:
使用NAudio库中的`WaveFileReader`读取WAV文件,获取样本数据。
```csharp
using NAudio.Wave;
var waveFile = new WaveFileReader("path_to_your_wav_file.wav");
```
2. **时域图(时间序列)**:
可以直接遍历波形数据,绘制每个样本点到图表的时间线。
```csharp
double[] samples = new double[waveFile.Length];
waveFile.Read(samples, 0, samples.Length);
for (int i = 0; i < samples.Length; i++)
{
// 时间轴坐标
double time = i / waveFile.WaveFormat.SampleRate;
// 画出值
chart.Series.Points.AddXY(time, samples[i]);
}
```
3. **频域图(FFT)**:
使用Fast Fourier Transform (FFT),将时域信号转换为频率空间,然后绘制频率轴和对应的振幅。
```csharp
using Accord.AudioSignalProcessing;
using Accord.Math;
double[] fftResult = FastFourierTransform.Dft(samples);
double[] frequencies = new double[samples.Length / 2 + 1];
for (int i = 0; i <= fftResult.Length / 2; i++)
{
frequencies[i] = i * waveFile.WaveFormat.SampleRate / fftResult.Length;
chart.Series.Points.AddXY(frequencies[i], Math.Abs(fftResult[i]));
}
// 可能需要调整频率轴显示范围
chart.ChartAreas[0].AxisX.Minimum = 0;
chart.ChartAreas[0].AxisX.Maximum = waveFile.WaveFormat.SampleRate / 2;
```
4. **能量图**:
能量图通常表示信号的能量分布,可以计算每个帧的总能量(方差)并绘制出来。
```csharp
double frameSize = waveFile.WaveFormat.BlockAlign / waveFile.WaveFormat.Channels;
int frames = samples.Length / frameSize;
double[] energies = new double[frames];
for (int i = 0; i < frames; i++)
{
int start = i * frameSize;
int end = start + frameSize;
energies[i] = GetEnergy(samples, start, end);
chart.Series.Points.AddXY(i, energies[i]);
}
private static double GetEnergy(double[] samples, int start, int end)
{
double sumOfSquares = 0.0;
for (int j = start; j < end; j++)
{
sumOfSquares += samples[j] * samples[j];
}
return sumOfSquares;
}
```
阅读全文