Ang materyal sa artikulo gikuha gikan sa akong
Paghimo og signal level meter
Sa ulahi
Niini nga artikulo magtigum kami usa ka circuit meter sa lebel sa signal ug mahibal-an kung giunsa pagbasa ang resulta sa pagsukod gikan sa filter. Atong susihon ang katukma sa pagsukod.
Ang hugpong sa mga filter nga gihatag sa media streamer naglakip sa usa ka filter, MS_VOLUME, nga makahimo sa pagsukod sa lebel sa RMS sa signal nga moagi niini, pagpahinay sa signal ug paghimo sa daghang mapuslanon ug wala damha nga mga gimbuhaton. Atong igahin ang tibuok artikulo niini nga filter sa ulahi. Apan sa pagkakaron gamiton nato kini isip metro.
Gigamit namon ang usa ka generator sa tono ingon usa ka gigikanan sa signal, ang signal gikan diin ipadala sa filter sa MS_VOLUME, sa output diin konektado ang sound card.
Niini nga pananglitan, atong gamiton ang generator filter sa usa ka gamay nga lahi nga mode - kini makamugna og usa ka tono nga signal alang kanato, i.e. usa ka signal nga adunay usa lamang ka sinusoidal oscillation.
Dugang pa sa frequency ug amplitude, kinahanglan natong itakda ang oras sa paghimo sa signal; kini kinahanglan nga igo aron adunay igo nga gidaghanon sa mga sample nga moagi sa MS_VOLUME filter alang sa pagsukod. Aron mabalhin ang mga setting sa generator, gigamit ang istruktura sa MSDtmfGenCustomTone:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Π’Π΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π° ΠΈΠ· 8 Π±ΡΠΊΠ².*/
int duration; /* ΠΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΠ³Π½Π°Π»Π° Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
.*/
int frequencies[2]; /* ΠΠ°ΡΠ° ΡΠ°ΡΡΠΎΡ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡΡΠΎΡΡΡ Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠΈΠ³Π½Π°Π». */
float amplitude; /* ΠΠΌΠΏΠ»ΠΈΡΡΠ΄Π° ΡΠΎΠ½ΠΎΠ², 1.0 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠΎΠ²Π½Ρ 0 Π΄Π ΠΎΡ ΠΌΠΈΠ»Π»ΠΈΠ²Π°ΡΡΠ° Π½Π° Π½Π°Π³ΡΡΠ·ΠΊΠ΅ 600 ΠΠΌ.*/
int interval; /* ΠΠ°ΡΠ·Π° Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΡΠ°Π»ΠΎΠΌ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ³ΡΡΠ²Π°Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°.*/
int repeat_count; /* ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΎΠ².*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;
Sa pagsugod sa generator, atong gamiton ang MS_DTMF_GEN_PLAY_CUSTOM nga pamaagi.
Block diagram sa pagproseso sa signal:
Ang code sa programa nga nagpatuman niini nga laraw gipakita sa ubos.
/* Π€Π°ΠΉΠ» 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);
}
Among gitipon ang among panig-ingnan, sama sa among gibuhat kaniadto, gamit lang ang ngalan sa file mstest3. Atong daganon kini ug makuha ang resulta:
ΠΠΌΠΏΠ»ΠΈΡΡΠ΄Π΅ ΡΠΈΠ½ΡΡΠ° 1.000000 Π²ΠΎΠ»ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠ΅Π΄Π½Π΅ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0.707733 Π²ΠΎΠ»ΡΡ.
Sama sa imong makita, ang resulta sa pagsukod mitakdo sa ikatulo nga decimal nga dapit nga adunay theoretical value nga katumbas sa square root sa duha nga gibahin sa tunga: sqr(2)/2=0,7071067811865475
Ang relatibong pagtipas sa resulta gikan sa tinuod nga bili mao ang 0.1%. Gisusi namon ang sayup sa pagsukod sa labing taas nga lebel sa signal. Tungod niini, samtang ang lebel mikunhod, ang sayup kinahanglan nga modaghan. Gisugyot ko nga imong susihon kini sa imong kaugalingon alang sa ubos nga lebel sa signal.
Sa sunod nga artikulo magtigom kita ug sirkito nga makamatikod sa presensya sa signal sa tono sa gihatag nga frequency sa input gamit ang tone detector. Makakat-on usab kami kung giunsa pagproseso ang mga panghitabo nga gihimo sa mga pagsala.
Source: www.habr.com