logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Pomiar widma(poziomu)sygnału mikrofonu za pomocą FFT w AVR

FastProject 02 Cze 2009 21:55 4751 10
REKLAMA
  • #1 6608743
    FastProject
    Poziom 28  
    Wtam,
    w temacie https://www.elektroda.pl/rtvforum/topic1326784.html#6608683

    zapytuję jak by tu najprościej zbadać poziom sygnału audio z mikrofonu elektretowego. Jednej z kolegów zaproponował układy typu sample-and-hold jednak nie używałem ich wcześniej i na razie ten temat zawieszam.

    W czasie jak nikt inny nie potrafi albo raczej nie ma ochoty i czasu mi pomóc, czytałem posty o FFT i zainteresował mnie ten temat i zastanawiam się, czy by tutaj tego nie wykorzystać. W podanym linku jest wytłumaczone o co mi chodzi.

    Czytałem ten https://www.elektroda.pl/rtvforum/topic14925.html temat i wiem że jest to (FFT) możliwe na mikrokontrolerze ATmega16.

    Co Panowie specjaliści od DSP sądzicie o zastosowaniu FFT w moim urządzeniu? Jeśli o poroniony pomysł i za bardzo sobie komplikuje to naprowadźcie mnie na coś innego .

    Z góry dzięki.Pozdrawiam
  • REKLAMA
  • #2 6609702
    Tantalos
    Poziom 18  
    FFT służy do analizy częstotliwościowej sygnału, a to koledze potrzebne nie jest. Wystarczy pomiar wartości skutecznej.
  • REKLAMA
  • #3 6609774
    FastProject
    Poziom 28  
    Ok, wydawało mi się że jak zmierzę całe widmo i jakoś je uśrednie lub zsumuje to będę miał informację o poziomie sygnału z mikrofonu.
    A jak kolega zrealizował by tu pomiar wartości skutecznej? W uP czy jakiś układ analogowy?
  • #4 6610699
    __Grzegorz__
    Poziom 30  
    Najprościej i najszybciej estymatę RMS dla sygnałów mowy można zrobić stosując lekko zmodyfikowane uśrednianie wykładnicze:

    x - próbka wejściowa...

    Stałe są "magiczne", dzięki czemu dzielenie sprowadza się do przesunięcia bitów w prawo :)

    
    #define CREST_RATIO (0x4)
    #define RMS_ATTACK_CONSTANT (0x10) 
    #define RMS_RELEASE_CONSTANT (CREST_RATIO*RMS_ATTACK_CONSTANT) 
    
    //świetna estymata RMSa sygnałów mowy (wsp. kształtu <=4)
    long RMS=CHANNEL->RMS_estimate;
    if (x>RMS)
    	//szybka korekta w górę
    	{
    	RMS=(RMS*(RMS_ATTACK_CONSTANT-1)+x)/RMS_ATTACK_CONSTANT;
    	}
    else
    	//wolna korekta w dół
    	{
    	RMS=(RMS*(RMS_RELEASE_CONSTANT-1)+x)/RMS_RELEASE_CONSTANT;
    	}
    CHANNEL->RMS_estimate=RMS;
    }
    }
    


    Wartości stałych są dla częstotliwości próbkowania 8kHz.
    Pomysł zaczerpnięty z dspguide.com... Próbki na wejściu są signed int oczywiście...
  • REKLAMA
  • #5 6610875
    FastProject
    Poziom 28  
    Jest to jeden z pomysłów, ale ja bym tu chciał określać poziom z jak największego pasma jakie otrzymam z mikrofonu a nie tylko dla sygnałów mowy.

    Dla próbkowania 8kHz przetwornik powinien pobierać dane co 125us tak?

    A co jeśli próbki będą unsigned int?

    Z przetwornika dostaję przecież wartości od 0 do 1023 a więc tylko dodatnie. Ato znaczy że napięcie na wejściu ADC będzie się zmieniać od 0 do 5V (przy odpowiednim wzmocnieniu).
    A przecież sygnał z mikrofonu będzie przybierał wartości ujemne a więc jak tu przesunąć skalę aby przetwornikiem ADC zczytywać też wartości ujemne.

    A tak z ciekawości jak zmiany stałych wpływają na otrzymaną wartość RMS?
  • REKLAMA
  • #6 6612939
    Tantalos
    Poziom 18  
    Można wg wzoru:
    √(1/T∫x²) lub cyfrowo
    √(1/n∑x²)

    Im więcej próbek tym dokładniejszy ale i wolniejszy będzie pomiar.
  • #7 6612960
    FastProject
    Poziom 28  
    Tantalos napisał:

    √(1/n∑x²)

    Im więcej próbek tym dokładniejszy ale i wolniejszy będzie pomiar.


    Czyli np najszybciej jak mogę pobieram próbki (napięcie) przez ADC.
    Załóżmy że pobiorę ich 32, czyli N=32?
    A x to wartość napięcia dla n-tej próbki?

    Ten wzór ma jakąś nazwę, skąd się wywodzi?Zawsze próbuje nawiązywać z praktyki do teorii i odwrotnie bo niestety na studiach nie potrafili połączyć teorii z praktyką, a teraz wychodzi brak wiedzy ;-)
  • #8 6613147
    Tantalos
    Poziom 18  
    Próbkujesz z częstotliwością 2 razy większą niż najwyższa częstotliwość w sygnale, czyli dla sygnału audio może być 40kHz. Ten wzór to znany wzór na obliczanie wartości skutecznej, gdzie x pod sumą to wartość próbki, a pod całką to funkcją dla której chcemy obliczyć wartość skuteczną.
  • #9 6613578
    __Grzegorz__
    Poziom 30  
    Wzory są OK, tylko, że operacja pierwiastkowania będzie dla AVR zabójcza (dłuuuuuugo będzie liczył ten pierwiastek).
    Na pewno nie w 2, 20, czy nawet 200 cykli zegara....
    Co przy dużej częstotliwości próbkowania u kolegi (szerokie pasmo audio) może (ale jak ktoś jest "cfany" to wcale nie musi) być przyczyną gubienia części próbek...
    A wtedy cały pomiar można o kant d..y potłuc :)
    Stąd moja propozycja estymaty, czyli przybliżenia wartości rzeczywistej.
    ...
  • #10 6613582
    FastProject
    Poziom 28  
    Tantalos napisał:
    gdzie x pod sumą to wartość próbki, a pod całką to funkcją dla której chcemy obliczyć wartość skuteczną.


    X czyli wartość zmierzonego napięcia podczas N-tego pomiaru zgadza się??????????????

    A ten wzór z całką to tylko jego inny zapis, bo jak obliczyć całkę w uP????

    I chyba nie potrzebuję aż 40kHz a tylko 32 bo wystraczy mi jak spróbkuje pasmo 16kHz.

    __Grzegorz__ napisał:

    Stąd moja propozycja estymaty, czyli przybliżenia wartości rzeczywistej.
    ...


    A jak zrealizować estymatę w uP?
  • #11 6613667
    __Grzegorz__
    Poziom 30  
    Estymatą (przybliżeniem) rzeczywistej wartości RMS sygnału jest zmienna RMS w kodzie podanym powyżej.

    Skuteczność kodu możesz sprawdzić sam, pisząc w dowolnym języku programik, któremu podasz do przerobienia sygnał sinusoidalny o różnych częstotliwościach.
    RMS dla sinusa jest znany, więc będziesz w stanie ocenić jak bardzo estymata odbiega od wartości rzeczywistej.

    Będziesz mógł także dobrać bardziej optymalne wartości stałych...

    P.S. Jest jeszcze mały "haczyk" jeżeli chodzi o wzór, nie pozwalający na bezpośrednie wstawienie wartości z przetwornika ADC jako x do wzoru.
    Ten haczyk to składowa stała (wartość z ADC gdy cisza na wejściu), która bardzo wpłynie Ci na wartość RMS.
    Śmiem twierdzić, że będzie nawet dominować...
    Wypada się go pozbyć. Albo "po chamsku", odejmując od wartości z ADC stałą wartość, albo bardziej elegancko stosując najprostszy filtr FIR górnoprzepustowy...

    P.S.2. Całkowanie to inaczej sumowanie z nieskończoną precyzją (dowolnie małym krokiem). W uP odpowiadać temu będzie zwykłe dodawanie co okres próbkowania. Ale to podstawy, panowie....
REKLAMA