0

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

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

我研究了使用 NAudio,这似乎很有希望:http://naudio.codeplex.com/他们 有一个频谱分析仪的演示,但他们没有提供该演示的源代码。

我还查看了这个http://wpfsvl.codeplex.com/,它使用 NAudio,但它使用 WPF 而不是 WinForms(我的项目使用 WinForms),我不确定如何将它转换为 WinForms。

Google 似乎没有太多关于 .Net 的信息我真正需要的是一个具有 NAudio 实现的源的实际示例,但我能找到的只是其他人指出示例源不是t 实际可用。

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

4

2 回答 2

0

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

这是我的结果:http: //puu.sh/4mWU8.png

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

使 Spectrum Analyzer 从该工具箱工作所需的最低要求如下:

  • 'NAudio-Visualizing' 文件夹的所有内容(波形的东西除外,除非你想要它)。
  • CommonUtils\ColorUtils.cs
  • CommonUtils\ExtendedGraphics.cs
  • CommonUtils\MathUtils.cs
  • CommonUtils\MidiUtils.cs
  • CommonUtils\Audio\NAudio\AudioUtilsNAudio.cs
  • CommonUtils\Audio\NAudio\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,我在这里使用了转换器。虽然它不能正确转换所有内容,但需要以下值得注意的修复:(不幸的是,我不记得我所做的所有更改,这并不难,您可以搜索您可能遇到的任何转换问题)

  • 在类中从任何语句中MathUtils移除并添加到方法中。returnYield return ...Iterator
  • 将类更改MathUtils为模块以修复扩展错误。
  • 用 .修复Case语句...,Else
  • varFor Each语句中删除。
  • ExtendedGraphics类中,将命名空间重命名System.Drawing.Extended为,AudioSystem.Drawing.Extended因为它与命名空间冲突System

我个人做了一些改变:

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

  • NAudioEngine课堂上,我将 Pause 功能更改为使用淡入淡出,因为在没有淡入淡出的情况下,似乎有一个错误会在恢复时产生静态。进行以下更改以添加淡入淡出(以及额外的音量控制):

添加字段:

    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

OpenFileMethod 中,将Try语句中的 all 更改为:

    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()

要将图形的样式更改为条形,在自定义频谱分析器控件的代码中,将默认值更改Public DoSpectrumGraph As Boolean = TrueFalse。然后,您可以更改其上方的字段以根据需要设置条形样式。

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

于 2013-09-09T11:43:05.853 回答
0

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

这不是真正的频谱图,尽管频谱分析仪可能是正确的。它有时简称为“实时分析器”或 RTA。

第一步是将信号分成多个频带。您可以使用 FFT 来做到这一点(这将使您了解如何使用 FFT),我相信很多人都这样做,但由于各种原因,这不是正确的方法。

由于频带如此之少,您应该能够使用一组二阶滤波器来实现此目标。对底部频率使用低通滤波器,对顶部频率使用高通滤波器,对中频使用带通滤波器。选择滤波器的中心频率,使频率为对数。如果您愿意,可以查找这些东西的标准频率。

将信号分成多个频段后,请为每个频段跟进一个峰值计。

于 2013-09-07T21:57:29.083 回答