c# 写一个将音频的时域数据 double[]转换为频域数据的方法
时间: 2024-09-20 22:07:19 浏览: 68
FFT.rar_FFT 仿真_数据FFT_时域数据
5星 · 资源好评率100%
在 C# 中,你可以使用 `NAudio` 库来进行音频处理,包括时域到频域的转换。其中,常用的是 Fast Fourier Transform (FFT) 算法,例如通过 `FastFourierTransform` 类。下面是一个简单的示例,展示如何将一维 `double` 数组的时域数据转换为频域数据:
```csharp
using NAudio.Wave;
using System.Numerics;
public static Complex[,] ConvertToFrequencyDomain(double[] timeDomainData, int sampleRate)
{
// 首先确定数据长度和需要的FFT大小(通常取2的幂次)
int fftLength = 4096; // 这里只是一个示例值,实际应用中可以根据需要调整
int numSamples = timeDomainData.Length;
if (fftLength > numSamples)
fftLength = numSamples;
// 创建复数数组用于存储频域数据
Complex[,] frequencyData = new Complex[fftLength / 2 + 1, 1];
// 对数据进行预处理和填充零值
var paddedData = new double[fftLength];
Array.Copy(timeDomainData, 0, paddedData, 0, Math.Min(numSamples, fftLength));
for (int i = numSamples; i < fftLength; i++)
paddedData[i] = 0;
// 使用 FFT
using (var fft = new DiscreteFourierTransform(fftLength))
{
fft.FFTForward(paddedData);
// 只保留正频率部分并复制到结果矩阵
for (int i = 0; i <= fftLength / 2; i++)
frequencyData[i, 0] = paddedData[i];
}
return frequencyData;
}
// 示例用法
double[] timeDomainSample = ...; // 你的时域音频样本数据
int sampleRate = ...; // 采样率
Complex[,] freqDomainData = ConvertToFrequencyDomain(timeDomainSample, sampleRate);
```
在这个例子中,返回的是一个二维 `Complex` 数组,表示频域数据。请注意,你需要先安装 `NAudio` NuGet 包才能运行这个代码。
阅读全文