Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Generacja sinusoidy o konkretnej czestotliwości

Dave_PL 26 Sty 2011 23:57 1690 5
  • #1 26 Sty 2011 23:57
    Dave_PL
    Poziom 14  

    Witam,

    Mam taki problem. Chcę przetestować kodek i w tym celu potrzebuje wygenerować sinusoidę o konkretnej częstotliwości. Z kodekiem komunikuję się po I2S, a częstotliwość próbkowania to 48kHz, a częstotliwość generowanej sinusoidy to 20kHz. I teraz pytanie jak to zrobić :) Zastanawiałem się nad jakimś ROM'em gdzie będę przechowywał (wcześniej wygenerowane) wartości sinusa i co tak zegara odczytywał. Jednakże skoro Fs = 48kHz, a chcę generować sinusoidę o F = 20 kHz to teoretycznie na okres sinusoidy muszę spróbkować troszkę powyżej dwóch wartości (Nyquist)? Jeżeli dobrze myślę to jak obliczyć które to mają być wartości. No chyba, że jest jakiś prostszy sposób na generację sinusoidy o konkretnej częstotliwości?

    Ponadto zastanawiałem się czy taka sinusoida będzie wyglądała normalnie gdybym chciał to oglądać np. na analizatorze widma (mowa tu o tej 20kHz) ?

    Pozdrawiam,
    Dave

    0 5
  • Pomocny post
    #3 30 Sty 2011 15:21
    nuclear
    Poziom 11  

    najprościej to bym proponował stablicować kilka okresów, tak żeby pierwsza próbka była w tej samej fazie sinusa co następna po ostatniej. na oko licząc będzie to 12 próbek (5 okresów).

    0
  • Pomocny post
    #4 30 Sty 2011 15:30
    TWl
    Poziom 20  

    Jesli sinus ma być "czysty" i nie wymagać żadnej filtracji na zewnątrz FPGA, polecałbym algorytm CORDIC (http://en.wikipedia.org/wiki/CORDIC).

    TW

    0
  • #5 30 Sty 2011 16:51
    Dave_PL
    Poziom 14  

    Wydaje mi się, że CORDIC to trochę przerost formy nad treścią skoro pewnie w kodeku jest jakiś (a przynajmniej powinien być) jakiś filtr na wyjściu. W związku z tym chyba wybiorę opcję generacji za pomocą NCO, dzięki czemu mam łatwą zmianę częstotliwości za pomocą Tuning Word'a.

    @nuclear
    Możesz przybliżyć Twoją propozycję. Bo o ile dobrze mi się wydaję to proponujesz rozwiązanie dla konkretnej częstotliwości, a nie dla zmiennych 0 - 20kHz. Co prawda w pierwszym poście pisałem o jednej, jednak teraz zmieniłem plany.

    0
  • #6 30 Sty 2011 17:06
    nuclear
    Poziom 11  

    Dokładnie tak, sugerując się pierwszym postem zaproponowałem rozwiązanie dla konkretnej częstotliwości. Wtedy faktycznie 12 kolejnych próbek (dla wartości 20kHz i 48ksps) obejmujących w praktyce 5 kolejnych okresów sinusa powoduje ze wysyłane cyklicznie dadzą najlepszy sinus jaki można uzyskać przy tych założeniach. Użycie Cordica jest dobrym rozwiązaniem(ale faktycznie skomplikowanym), jednak prostszym (ale niemałym) rozwiązaniem będzie po prostu stablicowanie całego sinusa(a przynajmniej ćwiartki) i odpowiednio wybierać która próbka ma być wysłana. TO rozwiązanie jest dobre, z tym że przy niskich częstotliwościach może się okazać wskazana interpolacja próbek. NCO się nie zajmowałem więc się nie wypowiem.

    0