Le contenu de cet article est tiré de ma .
Créons un détecteur de niveau de signal
Dans le passé, Nous avons clarifié la manière de terminer correctement les programmes utilisant le mediastreamer.
Dans cet article, nous allons assembler un schéma de détecteur de niveau de signal et apprendre à lire le résultat de mesure à partir du filtre. Nous évaluerons la précision de la mesure.
Dans le jeu de filtres fourni par le mediastreamer, il y a un filtre, MS_VOLUME, capable de mesurer le niveau efficace du signal qui le traverse, d'atténuer le signal et d'exécuter de nombreuses fonctions utiles et inattendues. Nous consacrerons un article entier à ce filtre plus tard. Mais pour l'instant, nous allons l'utiliser comme détecteur.
Comme source du signal, nous allons utiliser un générateur de tonalité, dont le signal sera dirigé vers le filtre MS_VOLUME, à la sortie duquel est connectée une carte son.
Dans cet exemple, nous allons utiliser le filtre du générateur dans un mode légèrement différent — il générera pour nous un signal unidimensionnel, c'est-à-dire un signal contenant seulement une oscillation sinusoïdale.
Outre la fréquence et l'amplitude, nous devrons spécifier le temps pendant lequel le signal sera généré, ce temps doit être suffisant pour que le filtre MS_VOLUME reçoive un nombre d’échantillons adéquat pour la mesure. La structure MSDtmfGenCustomTone est utilisée pour transmettre des paramètres au générateur :
struct _MSDtmfGenCustomTone{
char tone_name[8];
int duration;
int frequencies[2];
float amplitude;
int interval;
int repeat_count;
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Pour démarrer le générateur, nous allons utiliser sa méthode MS_DTMF_GEN_PLAY_CUSTOM.
Schéma structurel de traitement du signal :
![]()
Le code du programme qui réalise ce schéma est montré ci-dessous.
/* Файл mstest3.c */
#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; /* Будем генерировать один тон, частоту второго тона установим в 0.*/
dtmf_cfg.frequencies[1]=0;
dtmf_cfg.amplitude=1.0; /* Такой амплитуде синуса должен соответствовать результат измерения 0.707.*/
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);
}Nous compilons notre exemple, comme nous l'avons fait précédemment, mais en utilisant le nom de fichier mstest3. Nous exécutons et obtenons le résultat :
Une amplitude de sinus de 1.000000 volts correspond à une valeur efficace de 0.707733 volts.Comme vous pouvez le constater, le résultat de la mesure correspond à la troisième décimale près à la valeur théorique égale à la racine carrée de deux divisée par deux : sqr(2)/2=0,7071067811865475
L'écart relatif du résultat par rapport à la valeur réelle était de 0,1 %. Nous avons évalué l'incertitude de mesure à un niveau de signal maximal. Par conséquent, en réduisant le niveau, l'incertitude doit augmenter. Je vous propose d'évaluer vous-même cela pour de faibles niveaux de signal.
Dans le prochain article, nous allons assembler un schéma détectant la présence à l'entrée d'un signal sinusoïdal à une fréquence donnée à l'aide d'un détecteur de ton. Nous apprendrons également à traiter les événements générés par les filtres.
Source : habr.com
