Material do artigo retirado do meu canal zen .

Crie um medidor de nível de sinal
Em um artigo anterior , esclarecemos o término correto dos programas usando uma serpentina de mídia.
Neste artigo, montaremos o circuito de um medidor de nível de sinal e aprenderemos a ler o resultado da medição de um filtro. Estime a precisão da medição.
No conjunto de filtros fornecidos pelo streamer de mídia, existe um filtro, MS_VOLUME, que é capaz de medir o nível eficaz do sinal que passa por ele, atenuar o sinal e executar várias funções úteis e inesperadas. Abordaremos todo o artigo com esse filtro mais tarde. Mas agora vamos usá-lo como um medidor.
Como fonte de sinal, usaremos um gerador de tons, cujo sinal será enviado ao filtro MS_VOLUME, para a saída na qual uma placa de som está conectada.
Neste exemplo, usaremos o filtro do gerador em um modo ligeiramente diferente - ele gerará um sinal de tom único para nós, ou seja, um sinal contendo apenas uma oscilação sinusoidal.
, , , 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
O desvio relativo do resultado do valor verdadeiro foi de 0,1%. Fizemos uma estimativa do erro de medição no nível máximo do sinal. Assim, com uma diminuição no nível, o erro deve aumentar. Eu sugiro que você o avalie independentemente quanto a pequenos níveis de sinal.
No próximo artigo, montaremos um circuito que detecta a presença de uma determinada entrada de frequência na entrada de um tom usando um detector de tom. E também saiba como lidar com eventos gerados por filtros.