65.9K
CodeProject 正在变化。 阅读更多。
Home

多媒体峰值表控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (59投票s)

2008 年 5 月 25 日

CPOL

6分钟阅读

viewsIcon

340608

downloadIcon

22472

.NET 版本的多媒体电平表控件

PeakMeter Application

soundsmfc.jpg

soundsmfc.jpg

引言

不久前,我发布了 .NET 版的电平表控件,但我很快发现许多开发者不知道如何在自己的应用程序中使用它。这就是本次更新的原因。我将介绍为了实时显示音频电平表所需的各种组件。

描述

实时电平表处理包含三个模块。

Mic processing
  • 源:音频数据源,可以是麦克风、数字声音文件(CD 音频)甚至视频(如果您考虑捕获其音频部分)。无论您的源是什么,原理都相同,您需要将数据转换为适合信号处理的格式。
  • DSP 处理:我称之为 DSP 处理模块的组件负责将音频数据转换为峰值幅度格式。
  • 电平表渲染:这基本上就是渲染控件(就像本文的电平表控件一样)。渲染引擎不必像此控件那样花哨。可以使用进度控件来显示音频峰值。事实上,如果您查看 Windows 控制面板,就会发现它正是这样使用的。

音频源

麦克风是您能想到的最基本的音频源。
上图基本上说明了您的计算机如何接收麦克风发出的声音的数字样本。整个过程的工作方式是,您指定希望接收数据的格式,主要是 PCM 数据(脉冲编码调制),然后音频捕获设备将根据采样频率收集样本。PCM 数据和 WAVE 块是描述从 ADC(模数转换器)获取的数据的常用术语。
例如,以 22050 Hz 单声道音频(单声道)和 16 位分辨率对麦克风的音频样本进行数字化;假设您想每 100 毫秒接收一次样本,您需要提供一个 4410 字节的缓冲区(22050 * (16/8) * 0.1)。

我之前提到了文件源。文件源只是一个音频数据存储,可以快速访问您的样本。MP3、WMA 和 Ogg Vorbis 等音频格式,它们所做的只是在尽量保持音频质量的同时对数据进行压缩。

DSP 处理

DSP 处理是一个非常有趣的课题,值得学习和研究。此模块从源接收数字样本。它会近似原始波形并找到其峰值幅度。
由于本文无法详细介绍 FFT(快速傅里叶变换)的工作原理,我建议有兴趣的读者参考参考文献部分的一些链接,以增加他们对此过程的知识。

FFT 在信号处理中起着重要作用,可能是软件工程中最常被撰写的主题之一。在数字系统中,ADC(模数转换器)会提供一组数字音频样本(离散信号)。其背后的理论告诉我们,当我们在离散信号上执行 DFT(离散傅里叶变换)时,我们会找到其分量频率,包括它们的相位和幅度。我想指出,我说的不仅仅是纯正弦波,其中只有基频可见,而是对音频信号执行 DFT(或 FFT)通常会在相邻的频带中产生一些幅度。

现在我们要做的是找到我们分析的频率范围。根据采样定理,我们可以近似信号中的最大音频频率。奈奎斯特定理指出,基带 Fs > 2B,这意味着采样频率(数字)至少是 B 频率范围(模拟)中任何频率的两倍,才能重构原始信号并防止混叠。混叠是采样时导致不同信号无法区分(或彼此混叠)的现象。因此,如果我们以 44.1KHz(CD 音频质量)进行采样,我们可以捕获整个声音范围(约 20KHz)。

请注意,采样频率至少是最大频率的两倍,使用 44.1KHz 对 20KHz 正弦波进行数字化,可以为频谱分析提供比必需的稍多一些的样本。

Ideal FFT
Ideal FFT

电平表渲染

电平表简直是“小菜一碟”,因为 DSP 模块承担了所有繁重的工作。接下来,我们选择一组频率,并显示其最接近频带的幅度。电平表控件可以很简单,就像使用进度控件一样。但我猜我们偶尔也喜欢花哨一点!本文介绍的 PeakMeter 控件就是如此。

最好选择以下范围内的频率,因为它们通常存在于正常对话和音乐中。

Audio Frequency map

在 .NET 中使用 PeakMeter

您可以在 WinForms 应用程序中使用此控件的 .NET 版本。只需将其添加到工具箱,然后将其拖放到 WinForm 画布上即可。以下是此控件属性的摘要:

PeakMeterControl 属性

属性 描述
MeterStyle 以水平(PMS_Horizontal)或垂直(PMS_Vertical)显示电平表条带
ShowGrid 显示电平表背景网格
ColoredGrid 使用配色方案显示电平表背景网格
GridColor 背景网格颜色(当 ColoredGrid 属性为 false 时)
ColorNormal 低范围颜色
ColorNormalBack 低范围颜色背景(ColoredGrid=1
ColorMedium 中范围颜色
ColorMediumBack 中范围颜色背景(ColoredGrid=1
ColorHigh 高范围颜色
ColorHighBack 高范围颜色背景(ColoredGrid=1
BandsCount 条带数量
LEDCount 每个条带的 LED 数量(当为 1 时,条带是平滑的)
FalloffSpeed 衰减效果速度(1=快,10=正常,100=慢)
FalloffEffect 启用衰减效果,调用 Start() 运行
FalloffColor 衰减线颜色

PeakMeterControl 方法

名称 描述
bool Start(int delay) 启动动画(延迟以毫秒为单位)。可以从非 UI 线程调用。
bool Stop() 停止动画。可以从非 UI 线程调用。
void SetMeterBands(int bands, int led) 一次性设置电平表条带属性和 LED 数量。
void SetRange(int min, int med, int max) 更改电平表控件的默认范围。
bool SetData(int[] values, int offset, int size) 设置电平表数据。可以从非 UI 线程调用。

使用 PeakMeter

使用此控件非常简单,将其添加到工具箱并将其拖到窗体上。您可以使用 Start 方法来为衰减效果制作动画。演示用随机数字填充数据。

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 演示

SoundStudio 应用程序是一个简单的声音播放器应用程序,能够播放各种音频文件(.wav.mp3.wma)。它使用 WindowsMedia .NET 库来解析音频。
SoundStudioCS(C# 版本)可以使用非托管 DLL(FFTLib.dll)构建。只需将 **USE_FFTLIB** 添加到您的项目构建设置中(构建 -> 常规选项卡)。

WindowsMedia .NET(发布版)的一些功能是:

  • Microsoft WAVE 设备支持(waveInOpenwaveOutOpen
  • DirectShow 过滤器,包括采样器过滤器
  • Microsoft Multimedia Streaming Interfaces

参考文献

历史

  • 2008/04/09:更新了所有示例(+WindowsMedia 发布版)
  • 2008/08/13:SoundStudio 发布(包含 WindowsMedia 预发布版)
  • 2008/05/24:.NET 初版
© . All rights reserved.