C#获取.wav文件的频谱线

Posted

技术标签:

【中文标题】C#获取.wav文件的频谱线【英文标题】:C# get frequency spectrum lines of a .wav file 【发布时间】:2019-12-24 14:07:35 【问题描述】:

我想显示 .wav(或 .mp3)文件的频谱。 我现在有点卡住了,找不到任何好的东西。 我使用 C# 和 naudio nuget 来处理音频数据和 oxyplot 来显示点(和图表)。

初始化:

AudioFileReader fileStream;
fileStream = new AudioFileReader(fileName);

private static List<List<double>> spec_data;
spec_data = new List<List<double>>();
private static List<short> unanalyzed_values = new List<short>();

音频朗读:

//8192, 4096, 2048, 1024
BUFFERSIZE = 4096;
var buffer = new byte[BUFFERSIZE];
       
int bytes_read = fileStream.Read(buffer, 0, buffer.Length);
       
int BYTES_PER_POINT = fileStream.WaveFormat.BitsPerSample / 8; //8Bit = 1Byte

for (int n = 0; n < BYTES_PER_POINT; n ++)

     short[] values = new short[buffer.Length / BYTES_PER_POINT];

     for (int i = 0; i < bytes_read; i += BYTES_PER_POINT)
     
         //each byte become one value
         values[i / BYTES_PER_POINT] = (short)((buffer[i + 1] << 8) | buffer[i + 0]);
     

     unanalyzed_values.AddRange(values);

块分析:

// insert new data to the right-most (newest) position
List<double> new_data = new List<double>();

Complex[] fft_buffer = new Complex[BUFFERSIZE];

for (int i = 0; i < BUFFERSIZE; i++)

    fft_buffer[i].X = (float)(unanalyzed_values[i] * FastFourierTransform.HammingWindow(i, BUFFERSIZE));
    fft_buffer[i].Y = 0;


FastFourierTransform.FFT(true, (int)Math.Log(BUFFERSIZE, 2.0), fft_buffer);

for (int i = 0; i < fft_buffer.Length -1; i++)

    double val;
    val = (double)fft_buffer[i].X + (double)fft_buffer[i].Y;
    val = Math.Abs(val);
    new_data.Add(val);
 

 new_data.Reverse();

 spec_data.Insert(spec_data.Count, new_data);
    如何获取音频文件的所有频谱点? 如何才能让这些“热图”线脱离光谱?这是仅 FFT 过程吗?(图 1)

【问题讨论】:

【参考方案1】:

好的,最后我找到了一个很好的 nuget 来实现:

https://github.com/swharden/Spectrogram

https://www.nuget.org/packages/Spectrogram/

var spec = new Spectrogram.Spectrogram(
                                        sampleRate: 44100,
                                        fftSize: 4096, //resolution size for the values
                                        step: 200);

float[] values = Spectrogram.Tools.ReadWav(fileName);

spec.AddExtend(values);

// convert FFT to an image
bmp = spec.GetBitmap(
                     intensity: 0.5, //loudness filter
                     freqHigh: 200,
                     freqLow: 50,
                     showTicks: true,
                     colormap: Spectrogram.Colormap.grayscale);

线索是设置正确的强度。从嘈杂的频谱图中过滤掉响亮的语音线。

【讨论】:

以上是关于C#获取.wav文件的频谱线的主要内容,如果未能解决你的问题,请参考以下文章

WAV 文件的 FFT 和输出以绘制频谱

计算 wav 文件和录制声音的频谱图(音量标准化)

获取 WAV 文件的 PCM 值

在将数据输入 FFT 用于音频频谱分析仪之前,使用 python 将 wav 文件转换为 csv 文件 [关闭]

谁知道如何在python中用处理wav文件,并且对他的频谱进行分析的程序

AttributeError:“模块”对象没有属性“频谱图”