文章资料取自我的禅宗频道。

创建一个信号电平表
在上一篇文章中,我们阐明了使用媒体流媒体的程序的正确终止。
在本文中,我们将组装信号电平计的电路,并学习如何从滤波器读取测量结果。估计测量的准确性。
在媒体流提供的一组滤波器中,有一个MS_VOLUME滤波器,它能够测量通过它的信号的均方根电平,衰减信号并执行许多有用和意外的功能。稍后,我们将使用此过滤器介绍整篇文章。但是现在我们将其用作仪表。
我们将使用音调发生器作为信号源,信号源将从信号发生器发送到MS_VOLUME滤波器,并与声卡的输出连接。
在此示例中,我们将以略有不同的模式使用生成器滤波器-它将为我们生成单音信号,即 仅包含一个正弦波振荡的信号。
, , , MS_VOLUME . MSDtmfGenCustomTone:
struct _MSDtmfGenCustomTone{
char tone_name[8];
int duration;
int frequencies[2];
float amplitude;
int interval;
int repeat_count;
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;
, MS_DTMF_GEN_PLAY_CUSTOM.
:

, .
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
int main()
{
ms_init();
MSFilter *voidsource=ms_filter_new(MS_VOID_SOURCE_ID);
MSFilter *dtmfgen=ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *volume=ms_filter_new(MS_VOLUME_ID);
MSSndCard *card_playback=ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
MSFilter *snd_card_write=ms_snd_card_create_writer(card_playback);
MSTicker *ticker=ms_ticker_new();
ms_filter_link(voidsource, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, volume, 0);
ms_filter_link(volume, 0, snd_card_write, 0);
ms_ticker_attach(ticker,voidsource);
MSDtmfGenCustomTone dtmf_cfg;
strncpy(dtmf_cfg.tone_name, "busy", sizeof(dtmf_cfg.tone_name));
dtmf_cfg.duration=1000;
dtmf_cfg.frequencies[0]=440;
dtmf_cfg.frequencies[1]=0;
dtmf_cfg.amplitude=1.0;
dtmf_cfg.interval=0.;
dtmf_cfg.repeat_count=0.;
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM, (void*)&dtmf_cfg);
ms_usleep(500000);
float level=0;
ms_filter_call_method(volume, MS_VOLUME_GET_LINEAR,&level);
printf(" %f %f .\n", dtmf_cfg.amplitude, level);
}
, , mstest3. :
1.000000 0.707733 .
, : sqr(2)/2=0,7071067811865475
结果与真实值的相对偏差为0.1%。我们估算了最大信号电平下的测量误差。因此,随着水平的降低,误差应该增加。我建议您对小信号电平进行独立评估。
在下一篇文章中,我们将组装一个电路,该电路使用音调检测器来检测音调输入处是否存在给定的频率输入。并且还将学习如何处理过滤器生成的事件。