MP3音频频谱图?

时间:2013-09-07 16:35:42

标签: vb.net winforms audio spectrogram

一直在寻找一种方法,整天都没有希望。 我正在创建一个具有MP3播放功能的项目,我正在尝试包含一个频谱图(或频谱分析仪......不确定它的名称是什么),类似于此http://puu.sh/4lkMn.png(Winamp)(尽管如果它是不在酒吧,那也没关系)

我目前一直在使用WMP进行音频播放,但WMP没有任何绘制频谱图的方法。

我研究了使用看起来很有希望的NAudio:http://naudio.codeplex.com/ 他们有频谱分析器的演示,但他们没有提供该演示的来源。

我也研究了使用NAudio的http://wpfsvl.codeplex.com/,但它使用的是WPF而不是WinForms(我的项目使用的是WinForms),我不确定如何将其转换为WinForms。

谷歌似乎没有太多关于.Net的信息 我真正需要的唯一的东西是带有NAudio实现的源的实际示例,但我能找到的是其他人指出示例源实际上不可用的事实。

..我只是注意到他们的演示名称中有'wpf',所以即使源是可用的,它也类似于我无法使用的WPFSVL实现。 :(

2 个答案:

答案 0 :(得分:0)

没有足够的空间来完全回答你的问题,我担心我不知道有源代码的地方。我能做的最好的事情就是让你走上正确的道路。也许别人知道更完整的答案。

虽然频谱分析仪可能是正确的,但这并不是一个频谱图。它有时简称为“实时分析仪”或RTA。

第一步是将信号分成频段。您可以使用FFT(This will give you an idea of how to use an FFT)执行此操作,因为我确信很多人都这样做,但由于各种原因,这不是正确的方法。

由于乐队数量太少,您应该可以使用2nd order filters行来实现这一目标。底部频率使用低通,顶部频率使用高通,中频使用带通滤波器。选择滤波器的中心频率,使频率为对数。如果您愿意,可以查看这些标准的频率。

将信号划分为频段后,请为每个频段跟进peak meter

答案 1 :(得分:0)

我找到了我转换的示例,它是AudioVSTToolbox

以下是我的所有结果:http://puu.sh/4mWU8.png

(我正在复制我的Winamp主题:))

从该工具箱中获取频谱分析仪所需的最低要求如下:

  • 文件夹'NAudio-Visualizing'的所有内容(除非您需要,否则为Waveform内容除外)。
  • CommonUtils \ ColorUtils.cs
  • CommonUtils \ ExtendedGraphics.cs
  • CommonUtils \ MathUtils.cs
  • CommonUtils \ MidiUtils.cs
  • CommonUtils \音频\ n音讯\ AudioUtilsNAudio.cs
  • CommonUtils \音频\ n音讯\ NAudio.dll
  • CommonUtils \ FFT \ AudioAnalyzer.cs
  • CommonUtils \ FFT \ FFTWindows.cs
  • CommonUtils \ FFT \ LomontFFT.cs
  • CommonUtils \ FFT \ ExocortexDSP \ Complex.cs
  • CommonUtils \ FFT \ ExocortexDSP \ ComplexF.cs
  • CommonUtils \ FFT \ ExocortexDSP \ Fourier.cs
  • CommonUtils \ FFT \ ExocortexDSP \ FourierDirection.cs

如果转换为VB .Net,我使用转换器here。它并没有正确地转换所有内容,以下是需要注意的重要修复:(我不记得所有我做过的更改,不是很难,你可以搜索你可能遇到的任何转换问题)

  • MathUtils班级中从return个语句中删除了Yield return ...,并将Iterator添加到该方法中。
  • MathUtils类更改为模块以修复带扩展名的错误。
  • 使用Case修复...,Else语句。
  • var语句中删除For Each
  • ExtendedGraphics类中,将名称空间System.Drawing.Extended重命名为AudioSystem.Drawing.Extended,因为它与System命名空间冲突。

我个人做了一些改变:

  • NAudioEngine类中,我将DesiredLatency属性的值更改为200,因为默认值会导致静态。

  • NAudioEngine类中,我更改了暂停功能以使用淡入淡出,因为没有淡入淡出,似乎存在一个在恢复时会产生静态的错误。进行以下更改以添加淡入淡出(以及额外的音量控制):

添加字段:

    Private m_Volume As Single = 0.2F 'Desired default volume
    Private audioFileReader As AudioFileReader
    Private fadeInOut As FadeInOutSampleProvider
    Private m_fadeDuration As Integer = 250 'Desired fading duration

OpenFile方法中,将Try语句中的全部更改为:

    waveOutDevice = New WaveOutEvent() With { _
        .DesiredLatency = definedLatency _
    }
    audioFileReader = New AudioFileReader(path)
    ActiveStream = DirectCast(audioFileReader, WaveStream)
    inputStream = New WaveChannel32(ActiveStream)

    fadeInOut = New FadeInOutSampleProvider(New WaveToSampleProvider(inputStream))
    audioFileReader.Volume = Volume()

    sampleAggregator = New SampleAggregator(m_fftDataSize)
    AddHandler inputStream.Sample, AddressOf inputStream_Sample
    waveOutDevice.Init(New SampleToWaveProvider(fadeInOut))

    ChannelLength = inputStream.TotalTime.TotalSeconds
    FileTag = TagLib.File.Create(path)
    GenerateWaveformData(path)
    CanPlay = True

Pause()方法更改waveOutDevice.Pause()fadeInOut.BeginFadeOut(fadeDuration())

Play()方法中,在CanPlay声明中:

    fadeInOut.BeginFadeIn(fadeDuration())
    waveOutDevice.Play()

要将图形样式更改为条形,请在自定义Spectrum Analyzer控件的代码中将Public DoSpectrumGraph As Boolean = True的默认值更改为False。然后你可以改变上面的字段来设置你想要的条形。

Event Overrides区域,您可以更改颜色/绘图方法。