Materi artikel dijupuk saka sandi
Nggawe meter level sinyal
Ing pungkasan
Ing artikel iki, kita bakal ngumpulake sirkuit meter level sinyal lan sinau babagan maca asil pangukuran saka saringan. Ayo ngevaluasi akurasi pangukuran.
Saringan saringan sing diwenehake dening streamer media kalebu saringan, MS_VOLUME, sing bisa ngukur tingkat RMS saka sinyal sing dilewati, nyuda sinyal lan nindakake akeh fungsi sing migunani lan ora dikarepake. Kita bakal nyawisake kabeh artikel menyang filter iki mengko. Nanging saiki kita bakal nggunakake minangka meter.
Kita bakal nggunakake generator nada minangka sumber sinyal, sinyal sing bakal dikirim menyang saringan MS_VOLUME, menyang output sing nyambungake kertu swara.
Ing conto iki, kita bakal nggunakake filter generator ing mode rada beda - iku bakal generate sinyal siji-nada kanggo kita, i.e. sinyal sing ngemot mung siji osilasi sinusoidal.
Saliyane frekuensi lan amplitudo, kita kudu nyetel wektu nalika sinyal bakal diasilake, kudu cukup supaya jumlah sampel sing cukup ngliwati panyaring MS_VOLUME kanggo pangukuran. Kanggo nransfer setelan menyang generator, struktur MSDtmfGenCustomTone digunakake:
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;
Kanggo miwiti generator, kita bakal nggunakake cara MS_DTMF_GEN_PLAY_CUSTOM sawijining.
Blok diagram pangolahan sinyal:
Kode program sing ngleksanakake skema iki kapacak ing ngisor iki.
/* Π€Π°ΠΉΠ» 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);
}
Kita ngumpulake conto, kaya sadurunge, mung nggunakake jeneng file mstest3. Ayo mbukak lan entuk asil:
ΠΠΌΠΏΠ»ΠΈΡΡΠ΄Π΅ ΡΠΈΠ½ΡΡΠ° 1.000000 Π²ΠΎΠ»ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠ΅Π΄Π½Π΅ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0.707733 Π²ΠΎΠ»ΡΡ.
Minangka sampeyan bisa ndeleng, asil pangukuran pas karo panggonan desimal katelu kanthi nilai teoretis sing padha karo akar kuadrat saka rong dibagi setengah: sqr(2)/2=0,7071067811865475
Penyimpangan relatif saka asil saka nilai sing bener yaiku 0.1%. Kita ngevaluasi kesalahan pangukuran ing tingkat sinyal maksimal. Patut, minangka tingkat sudo, kesalahan kudu nambah. Aku saranake sampeyan ngevaluasi dhewe kanggo tingkat sinyal sing kurang.
Ing artikel sabanjure kita bakal ngumpulake sirkuit sing ndeteksi ananΓ© sinyal nada saka frekuensi tartamtu ing input nggunakake detektor nada. Kita uga bakal sinau carane ngolah acara sing digawe dening saringan.
Source: www.habr.com