Czy ostatecznie planujesz udostępnić taki filtr dla forumowego zamówienia?
Ne planuję Ten projekt nie będzie udostępniony w stylu USB Audio czy DAC'a na AD1865, ale jak ktoś będzie chciał to może ode mnie wziąć gotowy układ do podłączenia. Na razie i tak czekam na PCB z fabryki, więc jak przyjdzie to będę testował finalną wersję
Dosyć małe i zgrabne PCB Kilka diodek i tylko takich, które są faktycznie wymagane i wskazują status działania filtru. Diody "MULTIPLYING" oraz "WAITING" wskazują po prostu na to co w danej chwili robi rdzeń, tj. czy w danej chwili mnoży i mieli nową próbkę czy po prostu czeka na następną. Dioda "ERROR FS" wskazuje na błąd częstotliwości wejściowej, która generalnie musi mieścić się w zakresie od 44.1 kHz do 768 kHz. Tak samo dioda "ERROR MCLK" wskazuje błąd od strony zegara MCLK.
Na razie to tyle. Muszę zrobić kilka testów odsłuchowych i zobaczyć, czy wszystko jest OK
Zapomniałem o najważniejszym, tj. odpowiedz impulsowa filtru o minimalnej fazie:
Rekonstrukcja sygnału też jest perfekcyjna (oczywiście przy 0 dBFS):
Trzeba będzie się zastanowić jaki typ filtru finalnie wrzucić do tego projektu Tłumienie obu jest wystarczające (z czego filtr o liniowej fazie tłumi znacząco mocniej, ale to są różnice między 110 dB a 140+ dB...).
Przbliżenie na współczynniki filtru:
Z tego co poniżej widać nastąpił overflow przy prostokątnym sygnale:
Normalna sprawa. W audio nie występują prostokąty a energia spektrum takiej fali jest znacząco wyższa niż sinusoidy przy 0 dBFS
Poniżej tak jak wygląda zbocze narastające prostokątu przy mniejszej amplitudzie:
Projekt uważam za zakończony Oczywiście na pewno jakieś poprawki będą, ale wszystko co było możliwe do zrobienia zostało zrobione.
Nie muszę już myśleć jaki filtr załadować do projektu (tj. minimalno fazowy czy o liniowej fazie), ponieważ załadowałem oba Dobrze, że nie zamówiłem PCB a stwierdziłem, że spróbuję to jeszcze dodać no i się udało... Ledwo. Na PCB dodałem zworkę "ROM", która podczas włączenia zasilania (bądź resetu na micro-switchu) decyduje o tym jakie współczynniki załadować do pamięci. Oba filtry są rzędu 8192 i po prostu fizycznie nie da się więcej zmieścić w tym FPGA. Musiałem wejściowe FIFO przerzucić do "distributed RAM", ponieważ użycia "block RAM" było na poziomie 103% a dzięki temu spadło do 97% i udało się wszystko zmieścić...
Na PCB doszły dwie diody, które informują o tym, czy załadowany filtr jest typu "linear" bądź "minimum" :)
Zaraz będzie zakaz tworzenia nowych projektów
Dopiero co AD1865 się nasłuchałem, a tu wyglada ze trzeba coś innego montować.. ;p
Zawsze można usunąć część cyfrowej części tego DAC'a i wpiąć się z nowym filtrem zamiast AD1896 Na razie innego DAC'a nie zrobiłem do tego filtru, więc jeszcze nie ma na co wymienić :)
Zastanawiam się jeszcze nad inną wersją opisu dla tego układu, która posiada 8-krotny filtr interpolacyjny. W sumie jedyny użytek dla takiej edycji byłby TDA1541(A) grający do tych 384 kHz, ale jako, że jest to dosyć ceniony układ to muszę nad tym pomyśleć. Oczywiście taki filtr nie robiłby 16-krotnej interpolacji a potem 2-krotnej decymacji, więc po prostu byłby zaprojektowany od razu do 8-krotnej interpolacji (8 polifaz). Niestety nie wiem jak z miejscem, ponieważ z definicji 8-krotnego nadpróbkowania wymagane jest dwa razy więcej próbek (8192 / 8 = 1024) a "block RAM" już jest zajęty prawie w 100%. Pewnie następne FIFO pójdzie do "distributed RAM" i może jakoś się to zmieści. Zobaczymy.
Przetwornik akceptuje dane w formacie offset binary (2s complement dla reszty), zatrzaskuje drabinkę podczas tranzytu LE ze stanu niskiego na wysoki (odwrotnie względem reszty przetworników) oraz akceptuje wejściowe bity przy... opadającym zboczu BCLK. Tak, wszystko co się dało inaczej zrobić najwidoczniej zrobili
Nie zmienia to faktu, że coś tam wyskrobałem ze spin-offem filtru dla 8-krotnej interpolacji. Obsługę 768 kHz musiałem wyrzucić (nie jest to możliwe dla wyjściowego Fs na poziomie 384 kHz, ponieważ decymacja spowoduje aliasing). Polifzy filtru zmniejszone z 16 do 8 co automatycznie zwiększyło ilość próbek w linii z 512 do 1024, więc wszystkie FIFO poszły do "distributed RAM", ponieważ nie było już miejsca na cokolwiek (dwa filtry po 8192 współczynników oraz linia opóźniająca zajmują cały "block RAM"). Zegary z oscylatora zostały podzielone przez dwa (14 MHz => 7 MHz, itd.). Dodatkowo dla słowa wyjściowego na poziomie 16 bitów zmieniłem format wyjściowy na zgodny z TDA1541A (offset binary, tranzyt LE ze stanu niskiego na wysoki oraz wyrównanie danych do zbocza opadającego BCLK). W przypadku 18, 20 oraz 24 bitów zostało tak jak było (2s complement, zatrzask podczas tranzytu ze stanu wysokiego na nisku oraz wyrównanie danych do zbocza narastającego BCLK).
Będzie chwila to przetestuję na żywym TDA1541A, ale raczej na pewno będzie śmigać Nie ma możliwości dodania obsługi TDA1541A do głównej wersji (16-krotna interpolacja), więc finalnie będą dwa opisu do tego projektu (16-krotna interpolacja oraz 8-krotna interpolacja z innym formatem wyjściowym dla 16-bitów, więc w praktyce ta wersja jest dobra tylko i wyłącznie dla TDA1541A).
dzie chwila to przetestuję na żywym TDA1541A, ale raczej na pewno będzie śmigać Nie ma możliwości dodania obsługi TDA1541A do głównej wersji (16-krotna interpolacja), więc finalnie będą dwa opisu do tego projektu (16-krotna interpolacja oraz 8-krotna interpolacja z innym formatem wyjściowym dla 16-bitów, więc w praktyce ta wersja jest dobra tylko i wyłącznie dla TDA1541A).
Przeliczyłem się z tym. Nie będzie działać, ponieważ okazuje się, że TDA1541(A) wykorzystuje zbocze opadające od sygnału LE jako czyszczenie rejestru wejściowego i przygotowanie rejestru na nowe dane. Inaczej pisząc sygnał LE musi być w formie pulsu po zakończeniu taktowania danych a tak mój filtr nie działa (generuje on sygnał LE w wypełnieniu 50/50).
Ten przetwornik jest oporny jak cholera, ale jak będzie chwila to przepiszę opis filtru i przerobię PCB aby po prostu mieć dodatkową wersję tego filtru dla TDA1541(A)
No i finalna wersja tego filtru z asynchronicznym zegarem oraz 16-krotną interpolacją:
Bez zworki ROM:
Zworka ROM:
Zworka ROM decyduje o tym jaki filtr załadować do głównej pamięci RAM. Dostępne są dwa filtry, tj. o liniowej fazie oraz o minimalnej fazie. Oba są rzędu 8192 i fizycznie nie da się więcej zmieścić
Dodatkowo wczoraj też pogrzebałem i mam zrobioną wersję tego filtru pod TDA1540 / TDA1541 na lekko zmienionej PCB z 8-krotna interpolacją (maksymalnie do 384 kHz wejściowego sygnału), formatem typu offset binary oraz synchronicznym CLK wraz z sygnałem LE jako tzw. "strobe", czyli pulsem po zakończeniu taktowania. Testowałem na TDA1541A i działa fajnie. Minusem zegara synchronicznego i braku własnego oscylatora jest to, że MCLK jest faktycznie wymagane i musi mieć wartość 49.152 MHz, 45.1584 MHz, 36.864 MHz, 33.8688 MHz, 24.576 MHz, 22.5792 MHz, 12.288 MHz lub 11.2896 MHz.
Mój pobiera gdzieś lekko ponad 300 mA. Zasilany jest z USB Audio i jakoś daje radę :) Nie polecam, ale aż tak stabilizator na USB Audio się nie grzeje jak myślałem.
Generalnie można zasilać bezpośrednio z 3.3V lub z 5V bądź wyżej. Obojętnie, zależnie co kto posiada w swoim systemie.
Tak się zastanawiałem nad wygenerowaniem MCLK dla specjalnej wersji tego filtru do TDA1540/TDA1541A, która nie ma własnego oscylatora, ponieważ te przetworniki mają inny format wejściowy i generalnie potrzebują synchronicznego zegara. Sygnału MCLK zazwyczaj nie ma w przypadku odtwarzaczy CD czy innych wynalazków, które nie bazują na USB Audio czy WM8804, więc mały układzik na bazie CS2300-03:
LRCK jest mnożone przez 128 lub 256 i mamy MCLK :)
Opis CS2300-03:
Clock Multiplier / Jitter Reduction – Generates a Low Jitter 6 - 75 MHz Clock from a Jittery 23 kHz to 30 MHz Clock Source
The CS2300-03 is an extremely versatile system clocking device that utilizes a programmable phase lock loop. The CS2300-03 is based on a hybrid analog-digital PLL architecture comprised of a unique combination of a Delta-Sigma Fractional-N Frequency Synthesizer and a Digital PLL.
This architecture allows for generation of a low-jitter clock relative to an external noisy synchronization clock with frequencies as low as 23 kHz.
Zobaczymy jak sobie ten układ poradzi. Z tego co liczyłem to PLL będzie potrzebować typowo 4 ms na locka dla 44.1 kHz i ten czas się zmniejsza wraz ze wzrostem częstotliwości. Ciekawi mnie to, tym bardziej, że Cirrus Logic robi fajne PLLki i specjalnie do audio ("Audio Clock Generation and Jitter Reduction").
Tak dla jasności - główna wersja filtru cyfrowego ma własny oscylator, więc w praktyce ją te problemy nie dotyczą, ponieważ zaakceptuje większość częstotliwości jako MCLK
Skomentuj