在之前的版本中,发布了.NET版本的峰值表控件,但很快发现许多开发者不知道如何在他们自己的应用程序中使用它。这就是这次更新的原因。将介绍涉及的各种组件,以展示实时音频峰值表。
实时峰值表处理由三个部分组成:
音频数据源可以是麦克风、数字音频文件(CD音频)甚至是视频(如果考虑获取它的音频部分)。无论来源是什么,原则都是一样的,需要将数据转换为适合信号处理的格式。
例如,如果想以22050 Hz的单通道音频(单声道)和16位分辨率从麦克风数字化音频样本,并且假设希望每100毫秒接收一次样本,将需要提供一个4410字节的缓冲区(22050*(16/8)*0.1)。
数字信号处理是一个有趣且值得学习的主题。这个模块接收来自源的数字样本。它近似原始波形并找到其峰值幅度。
由于本文无法详细介绍快速傅里叶变换(FFT)的工作原理,建议感兴趣的读者访问参考部分的一些链接,以增加他们对此过程的了解。
FFT在信号处理中扮演着重要的角色,可能是软件工程中最常被讨论的主题之一。当处理数字系统时,模数转换器(ADC)给一组数字音频样本(离散信号)。理论告诉,当对离散信号执行离散傅里叶变换(DFT)时,找到了它的组成频率,包括它们的相位和幅度。
现在所要做的就是找到分析的频率范围。根据采样定理,可以近似信号中的最大音频频率。奈奎斯特定理指出,基带Fs > 2B,这意味着采样频率(数字)必须至少是B频率范围内任何频率的两倍,以便重建原始信号并防止混叠。混叠是一种效应,当采样时,不同的信号变得无法区分(或彼此的别名)。因此,如果以44.1kHz(音频CD质量)采样,可以捕捉到整个声音范围(大约20kHz)。
峰值表渲染非常简单,因为DSP模块承担了所有需要完成的工作。接下来选择一组频率并显示它们最近邻的频率的幅度。峰值表控件可以像使用进度控件一样简单。但想有时喜欢花哨一点!这里介绍的PeakMeter控件正是这样做的。
最好选择低于正常对话和音乐中通常发现的频率范围的频率。
可以在WinForms应用程序中使用这个控件的.NET版本。只需将其添加到工具箱中,然后将其拖放到WinForm画布上。以下是这个控件的属性摘要:
PeakMeterControl Properties
Property Description
MeterStyle Show Meter bands in Horizontal (PMS_Horizontal) or Vertical (PMS_Vertical)
ShowGrid Show meter background grid
ColoredGrid Show meter background grid using color schemes
GridColor Background grid color (when ColoredGrid property is false)
ColorNormal Low range color
ColorNormalBack Low range color Background (ColoredGrid=1)
ColorMedium Medium range color
ColorMediumBack Medium range color Background (ColoredGrid=1)
ColorHigh High range color
ColorHighBack High range color Background (ColoredGrid=1)
BandsCount Number of bands
LEDCount Number of LED per bands (when 1, band is smooth)
FalloffSpeed Falloff effect speed (1=fast, 10=normal, 100=slow)
FalloffEffect Enable falloff effect, call Start() to run
FalloffColor Falloff line color
以下是这个控件的方法摘要:
PeakMeterControl Methods
Name Description
Start(int delay) Start animation (delay in ms). Can be called from non-UI thread.
Stop() Stop animation. Can be called from non-UI thread.
SetMeterBands(int bands, int led) Set meter bands properties and number of LED in one call.
SetRange(int min, int med, int max) Change meter control default range.
SetData(int[] values, int offset, int size) Set peak meter data. Can be called from non-UI thread.
使用这个控件非常简单,将其添加到工具箱中并将其拖放到表单上。可以使用Start方法来动画化衰减效果。演示用随机数字填充数据。
C#
private void FillMeterData()
{
int[] meters1 = new int[NumLEDS];
Random rand = new Random();
for (int i = 0; i < meters1.Length; i++)
{
meters1[i] = rand.Next(0, 100);
}
// fill meter data
this.peakMeterCtrl1.SetData(meters1, 0, meters1.Length);
}
SoundStudio应用程序是一个简单的音频播放器应用程序,能够播放各种音频文件(.wav、.mp3和.wma)。它使用WindowsMedia .NET库来解析音频。