23-09-2026, 12:14
Pomiar siły odbieranego sygnału za pomocą narzędzi Arduino Audio Tools możliwy jest przez włączenie do łańcucha przetwarzania danych modułu z klasy VolumeMeter.
Do tej pory algorytm działał w cyklu: i2s -> filters -i2s gdzie lewe i2s to wejście sygnału po zamianie z analogowego na cyfrowy a prawe i2s to wyjście sygnału analogowego po zamianie z cyfrowego.
W module filters znajduje się łańcuch hilbert -> lpf/bpf tak więc w rzeczywistości pełny łańcuch wyglądał następująco: i2s -> hilbert -> lpf/bpf -> i2s.
Niestety, w przypadku procesora ESP32A1S z wbudowanym kodekiem audio (konwerter A/C i C/A + inne funkcje) rozróżnienie między i2s na wejściu i i2s na wyjściu nie jest oczywiste i realizowane jest przez dokładniejsze precyzowanie tych portów w sekcji setup{ } programu.
Poza tym, klasa VolumeMeter nie posiada, jak większość innych narzędzi Audio Tools tzw. defaultConfig czyli zestawu ustawień domyślnych niezbędnych do uruchomienia instancji z klasy VolumeMeter dlatego pewien czas zajęło mi wyszukanie sposobu w jaki zainicjować moduł VolumeMeter. Sposobem na to okazało się zbudowanie uniwersalnego pliku konfiguracyjnego:
Plik info zawiera niezbędne informacje potrzebne dla instancji klasy VolumeMeter do jej uruchomienia.
Pomiar sygnału może być włączony w dowolnym miejscu strumienia przetwarzania ale zwykle robi się to na wejściu lub na wyjściu.
Ale z punktu widzenia pomiaru siły sygnału konkretnego sygnału celowe jest mierzenie jego siły na wyjściu za filtrami ograniczającymi pasmo przetwarzania. Gdyby włączyć pomiar na wejściu to pomiarowi podlegałyby wszystkie sygnały docierające do konwertera a/c a konwersja z prędkością sample_rate "zobaczy" wszystkie sygnały o częstotliwości sample_rate/2 (zgodnie z teorią próbkowania) czyli w tym przypadku do 12kHz. Filtry działające przed pomiarem ograniczają pasmo do 3.6/2.4kHz dla SSB oraz do niewielkiego pasma wokół 800Hz przy odbiorze CW a więc w zasadzie mamy pomiar jednego sygnału.
Tak więc włączenie pomiaru w strumień przetwarzania danych poszerza ten łańcuch do postaci: i2s -> filters -> volumeMeter -> i2s .
Poniżej prezentuję obecną sekwencję przepływu danych w kodzie programu po włączeniu cyfrowego pomiaru siły sygnału.
Powyżej zarysowałem najważniejsze zmiany w programie związane z pomiarem sygnału. Inne istotne parametry jak definicje filtrów oraz konfiguracje kodeków ESP32A1S pozostały bez zmian.
Jak wspominałem, początkowo pokazany kod powodował, że kompilacja odbywała się bez błędów ale po wgraniu jej do procesora następował cykliczny jego restart co ok. 1 sek.
Nie mogąc sam sobie z tym poradzić zapytałem autora pakietu Arduino Audio Tools i prawie tydzień zajęło nam wykrycie, że winna było niezgodność pakietu podstawowego Audio Tools z pakietem Driver Tools, który obsługuje kodeki w ESP32A1S. O ile mój pakiet Driver Tools był aktualny to Audio Tools miało wersję dość odległą od obecnej co generowało problemy. Wydaje się, że początkowa instalacja mojego pakietu Audio Tools nie odbyła się ze strony na GitHub ale z jakiegoś miejsca gdzie ten pakiet polecano i tamten link prowadził właśnie do starszej wersji.
Po ustaleniu przyczyny okazało się, że mój początkowy kod włączenia pomiaru sygnału był poprawny ale kosztowało to stratę kilku dni i wykazaniem się słabą znajomością narzędzi Audio Tools wobec autora tego oprogramowania. Trochę to bolało ale żadna wiedza nie przychodzi łatwo ;-)
Pomiar sygnału w torze cyfrowym umożliwia całkowitą rezygnację z pomiaru na drodze analogowej.
[Obrazek: https://lx-net.pl/walet/image/arw01.jpg] [Obrazek: https://lx-net.pl/walet/image/arw02.jpg]
Te elementy można usunąć całkowicie bez szkody dla działania całości na płytce h0
[Obrazek: https://lx-net.pl/walet/image/arw03.jpg]
Dodatkowo, można też usunąć Q5 z otoczeniem z płytki ha
Obecny kod programu zawiera pomiar sygnału w torze cyfrowym co daje jednoznaczne wartości bez konieczności regulowania trymerami ustawień w torach analogowych.
Pisałem o tym wcześniej ale warto to przypomnieć w tym miejscu, że dynamika toru a/c to 16 bitów (65535 poziomów) ale w praktyce można liczyć na połowę tej wartości bo pełna dynamika dotyczy sygnałów zarówno na plus jak i na minus co oznacza ograniczenie do 15 bitów (32767 poziomów).
Z moich pomiarów i kalibracji miernika volumeMeter wynika, że tło szumowe przetwornika (bez sygnału na wejściu) to ok. 50 a największy poziom jaki można odebrać w tej skali (32767) to ok. S9 + 23dB.
Wydaje się to być wystarczające dla większości sytuacji z ewentualną reakcją dla sygnałów S9 +30, +40 i +60dB.
Taka reakcja może być wykonana za pomocą pokazanego powyżej układu U9 (PCF8574) oraz D7/RV2, D8/RV3 i ewentualnie D9/RV4. Może uda się zredukować tłumik sygnału na czterech diodach PIN do jednej lub dwóch ale na razie, jeśli jest on zamontowany to należy pozostawić jedynie D7/RV2 z RV2 ustawionym na poziom ok. 3-4k.
Na Github zamieściłem w części dotyczącej wersji 1.1 zarówno kod źródłowy jak i pliki bin dotyczące tej wersji.
lj.
Github
Do tej pory algorytm działał w cyklu: i2s -> filters -i2s gdzie lewe i2s to wejście sygnału po zamianie z analogowego na cyfrowy a prawe i2s to wyjście sygnału analogowego po zamianie z cyfrowego.
W module filters znajduje się łańcuch hilbert -> lpf/bpf tak więc w rzeczywistości pełny łańcuch wyglądał następująco: i2s -> hilbert -> lpf/bpf -> i2s.
Niestety, w przypadku procesora ESP32A1S z wbudowanym kodekiem audio (konwerter A/C i C/A + inne funkcje) rozróżnienie między i2s na wejściu i i2s na wyjściu nie jest oczywiste i realizowane jest przez dokładniejsze precyzowanie tych portów w sekcji setup{ } programu.
Poza tym, klasa VolumeMeter nie posiada, jak większość innych narzędzi Audio Tools tzw. defaultConfig czyli zestawu ustawień domyślnych niezbędnych do uruchomienia instancji z klasy VolumeMeter dlatego pewien czas zajęło mi wyszukanie sposobu w jaki zainicjować moduł VolumeMeter. Sposobem na to okazało się zbudowanie uniwersalnego pliku konfiguracyjnego:
Kod:
uint16_t sample_rate = 24000;
uint16_t channels = 2;
uint16_t bits_per_sample = 16; // or try with 24 or 32
AudioInfo info(sample_rate, channels, bits_per_sample);Plik info zawiera niezbędne informacje potrzebne dla instancji klasy VolumeMeter do jej uruchomienia.
Pomiar sygnału może być włączony w dowolnym miejscu strumienia przetwarzania ale zwykle robi się to na wejściu lub na wyjściu.
Ale z punktu widzenia pomiaru siły sygnału konkretnego sygnału celowe jest mierzenie jego siły na wyjściu za filtrami ograniczającymi pasmo przetwarzania. Gdyby włączyć pomiar na wejściu to pomiarowi podlegałyby wszystkie sygnały docierające do konwertera a/c a konwersja z prędkością sample_rate "zobaczy" wszystkie sygnały o częstotliwości sample_rate/2 (zgodnie z teorią próbkowania) czyli w tym przypadku do 12kHz. Filtry działające przed pomiarem ograniczają pasmo do 3.6/2.4kHz dla SSB oraz do niewielkiego pasma wokół 800Hz przy odbiorze CW a więc w zasadzie mamy pomiar jednego sygnału.
Tak więc włączenie pomiaru w strumień przetwarzania danych poszerza ten łańcuch do postaci: i2s -> filters -> volumeMeter -> i2s .
Poniżej prezentuję obecną sekwencję przepływu danych w kodzie programu po włączeniu cyfrowego pomiaru siły sygnału.
Kod:
......
I2SStream i2s; //utworzenie instancji klasy I2SStream o nazwie i2s
FilteredStream<int16_t, float> inFiltered(i2s, channels); //definicja filtrów inFiltred sterowanych danymi z wejścia i2s
VolumeMeter volumeMeter(inFiltered); //utworzenie mirnika sygnału volumeMeter sterowanego danymi z filtra
StreamCopy copier(i2s, volumeMeter); // sterowanie danymi z miernika sygnału wyjścia i2s
.....
void setup(void) {
.....
volumeMeter.begin(info); //uruchomienie miernika pomiaru siły sygnału
.....
}Jak wspominałem, początkowo pokazany kod powodował, że kompilacja odbywała się bez błędów ale po wgraniu jej do procesora następował cykliczny jego restart co ok. 1 sek.
Nie mogąc sam sobie z tym poradzić zapytałem autora pakietu Arduino Audio Tools i prawie tydzień zajęło nam wykrycie, że winna było niezgodność pakietu podstawowego Audio Tools z pakietem Driver Tools, który obsługuje kodeki w ESP32A1S. O ile mój pakiet Driver Tools był aktualny to Audio Tools miało wersję dość odległą od obecnej co generowało problemy. Wydaje się, że początkowa instalacja mojego pakietu Audio Tools nie odbyła się ze strony na GitHub ale z jakiegoś miejsca gdzie ten pakiet polecano i tamten link prowadził właśnie do starszej wersji.
Po ustaleniu przyczyny okazało się, że mój początkowy kod włączenia pomiaru sygnału był poprawny ale kosztowało to stratę kilku dni i wykazaniem się słabą znajomością narzędzi Audio Tools wobec autora tego oprogramowania. Trochę to bolało ale żadna wiedza nie przychodzi łatwo ;-)
Pomiar sygnału w torze cyfrowym umożliwia całkowitą rezygnację z pomiaru na drodze analogowej.
[Obrazek: https://lx-net.pl/walet/image/arw01.jpg] [Obrazek: https://lx-net.pl/walet/image/arw02.jpg]
Te elementy można usunąć całkowicie bez szkody dla działania całości na płytce h0
[Obrazek: https://lx-net.pl/walet/image/arw03.jpg]
Dodatkowo, można też usunąć Q5 z otoczeniem z płytki ha
Obecny kod programu zawiera pomiar sygnału w torze cyfrowym co daje jednoznaczne wartości bez konieczności regulowania trymerami ustawień w torach analogowych.
Pisałem o tym wcześniej ale warto to przypomnieć w tym miejscu, że dynamika toru a/c to 16 bitów (65535 poziomów) ale w praktyce można liczyć na połowę tej wartości bo pełna dynamika dotyczy sygnałów zarówno na plus jak i na minus co oznacza ograniczenie do 15 bitów (32767 poziomów).
Z moich pomiarów i kalibracji miernika volumeMeter wynika, że tło szumowe przetwornika (bez sygnału na wejściu) to ok. 50 a największy poziom jaki można odebrać w tej skali (32767) to ok. S9 + 23dB.
Wydaje się to być wystarczające dla większości sytuacji z ewentualną reakcją dla sygnałów S9 +30, +40 i +60dB.
Taka reakcja może być wykonana za pomocą pokazanego powyżej układu U9 (PCF8574) oraz D7/RV2, D8/RV3 i ewentualnie D9/RV4. Może uda się zredukować tłumik sygnału na czterech diodach PIN do jednej lub dwóch ale na razie, jeśli jest on zamontowany to należy pozostawić jedynie D7/RV2 z RV2 ustawionym na poziom ok. 3-4k.
Na Github zamieściłem w części dotyczącej wersji 1.1 zarówno kod źródłowy jak i pliki bin dotyczące tej wersji.
lj.
Github

