c# 写一个音频时域图转频域图的方法
时间: 2024-09-19 20:14:05 浏览: 82
在C#中,要将音频信号从时域转换为频域图,通常会使用快速傅立叶变换(Fast Fourier Transform, FFT)。这里是一个基本的例子,展示如何使用NAudio库来实现这一过程:
首先,确保已安装NAudio库,可以在这里下载:https://github.com/naudio/NAudio
```csharp
using NAudio.Wave;
using System.Numerics;
public class AudioToFrequencyDomain
{
public static void TimeDomainToFrequencyDomain(WaveStream waveStream)
{
var sampleProvider = new BufferedWaveProvider(waveStream.WaveFormat);
sampleProvider.BufferSize = 4096; // 选择合适的帧大小,越大精度越高,但计算成本也更大
sampleProvider.AddReadReference(waveStream);
float[] buffer = new float[sampleProvider.Length];
while (sampleProvider.Read(buffer, 0, buffer.Length) > 0)
{
Complex[] fftResult = FFT.Transform(samples: buffer);
// 将复数数组转换为幅度和角度数据
for (int i = 0; i < fftResult.Length / 2; i++)
{
double frequency = i * sampleProvider.WaveFormat.SampleRate / fftResult.Length;
double amplitude = fftResult[i].Magnitude;
// 这里你可以绘制频率和幅度的数据到图形上
DrawFrequencyAndAmplitude(frequency, amplitude);
}
}
}
private static void DrawFrequencyAndAmplitude(double frequency, double amplitude)
{
// 把频率和幅度添加到图表或其他图形处理组件中
// 这部分取决于你的UI库,比如Windows Forms、WPF 或 Chart.js等
// Console.WriteLine("Frequency: {0}, Amplitude: {1}", frequency, amplitude); // 示例,用于控制台打印
}
}
// 使用示例
WaveFileReader reader = new WaveFileReader(@"path_to_your_audio_file.wav");
AudioToFrequencyDomain.TimeDomainToFrequencyDomain(reader);
```
在这个例子中,`TimeDomainToFrequencyDomain`函数读取波形流,并对每个缓冲区应用FFT。你需要一个音频文件作为输入,并将其传递给`WaveFileReader`。注意,这个过程可能会消耗大量内存,所以确保有足够的资源。
阅读全文