DIY Electronic projects

Full Version: Class D Amplifier - High Quality Power Audio Amplifier
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Malo detaljnije oko I2S i DSD, nama treba pre svega razdvojeni levi i desni kanal, kod stereo PCM to se razdvajalo nakon 24/32 bita preko FS linije, kod DSD je nezgodno što nam je frame 1bit i FS signal treba tako da se ponaša, 1bit-levom, 1-bit-desnom, 1bit-levom kanalu i tako u krug, možda zatreba neki flip-flop ili enevtualno da se radi sa 2x većim clock da bi dobili efektivno 2 kanala preko jednog data-stream, u suštini ništa strašno i sve se nekako uklapa sa I2S modulom.
Audio semplovi moraju da budu specifično enkodirani, zvaće se .WAV nebitno je, unutra je specifično upisan raspored nula/jedinica tj u multipleksiranom DSD formatu (to procesiranje se na kraju smešta u kernel-driver da u letu radi konverziju, otom-potom).

Ovaj code je dobra polazna tačka kao primer, radi u user-space, obraduje specifično I2S, koristi DMA, ima audio procesiranja za RDS i MPX-Stereo (nebitno za našu priču) i generalno to sve nam treba samo da umetnemo našu PCM->DSD konverziju.
https://github.com/ChristopheJacquet/PiF...i_fm_rds.c
Ovaj kolega je napravio ovo što nama treba, iskoristio je PWM modul na RPi i napravio dva DSD L/R izlaza, i on pravi neki 1bit Class-D Smile
Jedino da mu "pomognemo" da još sredi ovih par TODO oko DMA kontrole ... Wink
https://gitlab.com/HITMAnsOFT/snd-bcm2835-dsd

Samo da podesim remote-build i probam to! Javljam šta se dešava ...

[Image: attachment.php?aid=38521]
Super, samo napred!

dsp:
https://www.audiosciencereview.com/forum...ial.29656/

Jedna vrhunska stranica sa c i matlab implementacijama:
https://www.ece.rutgers.edu/~orfanidi/intro2sp/
Ovaj program radi, uz male "poteškoće" (ima neke dropove na svaku sekundu) ali u suštini radi!!! Probao na RPi2.
Dobije je vrlo pristojan zvuk ovako na prvo slušanje ... Povezao sam PINR preko 47k otpornika na ulaz moje zvučne kartice pa dalje u monitore/amp.
Odprilike je "sve tu", i bass i visoki.
Nije loše za početak, treba detaljnija analiza ...
Nisam ni sumnjao da ne moze! Smile
Jos malo poslušao i poigrao se sa programom, prvo sam dodao da mi preskači procesiranje PCM->DSD jer to radi par minuta tj snimim sadržaj PWM buffera (oko 160MB) u test.dsd fajl i posle kada puštam ponovo učita fajl nazad u buffer i to odradi za 1 sekundu pa krene da svira.

Radi tako što koristi 32x16 FIFO buffer koji je povezan sa PWM modulom koji je podešen da izbacuje SERISKI informacije umesto Duty, clock je podešen na 2.8MHz i ima funkciju za proveravanje "kada je PWM slobodan" tj kada je prazan FIFO buffer da se prebaci sledeća grupa semplova iz glavnog/velikog PWM buffera/memorije, to vrti u krug dok ne odradi sve semplove/frejmove.

Sve u svemu pristup je dobar i ima smisla, puckanje i krckanje koje se primećuje je u relaciji sa opterećenjem procesora jer program troši 100% jednog CPU-core dok radi tako da to treba malo popraviti i prebaciti na DMA i onda bi odprilike sve bilo na svom mestu generalno kao koncept upotrebe PWM-a i pretvaranja u DSD/PDM.

[Image: attachment.php?aid=38525]
Super! Ajde okaci C program pa cu se ja malo poigrati sa polling funkcijama i interuptovima kada budem krenuo to da radim... Kod mene sam sveo touch drajver + ir led drajver i jos neke stvari kojee sam sam razvio na nulu iskoriscenosti cpu-a preko poll funkcija, pa cu probati i to tvoje da odradim da nam cpu bude sto manje zauzet.
STM32F7 serija ima dva hardverski odrađena SAI kanala. SAI je Serial Audio Interface i može da se uveže sa DMA kontrolerom. Probao sam to i dobio neki proizvoljan stream iz FLASH-a na frekvenciji bliskoj 2.822400MHz što bi trebalo da odgovara DSD64.
Nije tačna jer je glavni oscilator 8MHz pa deliteljima ne dobijam tačnu vrednost, odnosno treba da stavim neki drugi oscilator na NUCLEO pločicu sa STM32F767ZI mikrokontrolerom.
Imam 1KHz sine dsd64 testi fajl pa ću kasnije da probam sa njim.

Probao sam na F7 ali SAI ima na F4 i L4 i verovatno na još nekim serijama STM32.
Trebao bi da probam neki stm32 kada dodje na red, upravo sam narucio rp2040 cisto da vidim kako to malo cudo funkcionise i kako se programira, gledam da ga koristim u narednom periodu umesto microchipa 12f1840 za tamo neke stvari jer je isto tako malen a mogucnosti daleko vise nego taj pic, mozda bi i rp2040 mogao da udje u ovu audio pricu? Ima mogucnost da procesuira 32bit i2s https://arduino-pico.readthedocs.io/en/latest/i2s.html samo je pitanje do koje brzine moze to da podrzi

Edit:
vec uveliko se koristi ova biblioteka na rp2040 https://github.com/earlephilhower/ESP8266Audio
Razni moduli koje ovde spominjemo, SAI, I2S, PWM (serial) imaju zajedničku funkciju SERIALIZATORA (serializer) podataka, isto kao SPI, podaci su serializovani tako što se negde upiše recimo 32bit podatak 0xABCD1234 i definiše se CLOCK recimo 2.8MHz i interni HW modul to izbaci napolje 0 i 1 kako su već složene u trenutnom data registru za taj modul, UŠTEDO nam je 32 neka kruga iteracija u poredjenju da to radi na SW nivou i da za svaki bit mi angažujemo CPU, dakle umest CPU-a to je odradio HW modul u jednoj C instrukciji plus dodatno ako postoji FIFO buffer (kodr RPi2 ima 16 komada po 32bit, kada se koriste oba PWM modula radi naizmenično prenosi jednom pa drugom 32bit podatak) onda nam i to ŠTEDI procesiranje tako da program ima "fore" da periodično dopunjava FIFO buffer dok se HW modul brine da to izadje napolje tačno složeno u vremenu prema zadatom CLOCK.

Na RRi2 za taj PWM može da bude ulazni Clock do 100MHz, dobija se iz glavnog PLL 500MHz pa se deli ili može drugi PLL koji je vezan za 19.2MHz kristal pa isto da se deli, najbolje sa celobrojnim odnosom jer necelobrojne vrednosti dovode do užasnog Jitter-a, morao bi da se promeni 19.2MHz kristal za dobijanje tačnih frekvencija.

Kod ovog "serializovanog-PWM" modua na RPi tehnički nema početak/kraj na 1bit izlazu, nije stream "prekinut" ni u jednom trenutku, nema u strimu specifičnih hedera ili sekvenci umetnutih od strane HW modula kao što to ima kod na primer I2S sa FS signalom gde nije potpuno kontinualan stream na toj jednoj data liniji.
To je verovatno bio razlog zašto je kolega pravio predhodno spominjan program preko tog PWM modula a ne preko I2S koji isto postoji na RPi ali koji verovatno da ne može ovako da se konfiguriše da radi jer je predvidjen za PCM.

U praksi je moguće na primer od SMI 16-bit paralelnog porta i dodatak spoljnih shift-registra koji se externo klokuju napraviti isto serializator koji nam štedi 16 iteracija koje bi imali na 1-bit stream-u.

Na primer PCIe port za kartice ima serializatore i naravno sa druge strane desirializatore ali se vrte na 10Gbit+ i na to još x2 ili x4 kanala ili x16 kanala, raskrstili su odavno sa paralelnim portovima, sve sad ide preko serializatora Smile
Ja imam toliko stvari da probam da ne znam odakle bi prvo poceo. Jesi probao CamilaDSP? Kazu da nema nijednog eksternog hardverskog dsp-a da je bolji od ovog softverskog. Ovaj dole u atacmentu 18band equ + volume control, odlican! Ja ga probao u winampu za njega je i radjen, moze lako da se portuje u neki drugi program sa gui da posluzi kao equalizer na PCM

Quote:SuperEQ (Shibatch Super Equalizer) is a graphic equalizer, originally created as a plugin for Winamp by Naoki Shibata. SuperEQ uses 16383th order FIR filters using FFT. Its equalization is very precise. Note that unlike traditional equalizers, there is very little roll-off or overlap between the bands.

http://avisynth.nl/index.php/SuperEQ
(10-06-2022, 03:15 PM)savan Wrote: [ -> ]T... mozda bi i rp2040 mogao da udje u ovu audio pricu? Ima mogucnost da procesuira 32bit i2s https://arduino-pico.readthedocs.io/en/latest/i2s.html samo je pitanje do koje brzine moze to da podrzi

Njega sam ti i spominjao već. Nisam gledao ovu realizaciju i2s sa linka ali pošto RP2040 nema hardverski i2s mora da se u priču uključe njegovi PIO blokovi preko DMA. Ako ove arduino-like biblioteke tako rade onda će moći da prođe cela ova priča i na njemu. On max može da radi na 133MHz tako da bi to moglo da bude neko ograničenje (mada sam video da rade i overclocking).
Ovaj STM32F767 koji sam probao ide do 216MHz.
Može naravno da se realizuje cela priča preko PWM modula ali je meni bilo interesantnije da vidim ovaj SAI modul u akciji.
Preko PWM sam radio komunikaciju sa WS2812 LED trakama.
Znas sta mene tu zanima, ako bi se uspeo odraditi ovaj dsd bit plejer dali preko rpi dali preko stm dali preko rp2040, koju mi imamo mogucnost ako u pricu ubacimo i "on the fly" pcm u dsd konverter + dsp? Ako je i to moguce kakve su nam dalje mogucnosti jer sklop treba da ima mogucnost i da na ulazu prepozna mp3, wav, flac, ... itd formate + dsd format, to je vec pitanje za koje treba naci odgovor. Sve ovo nabrojano se jednostavno resava upotrebom ct7302 + adau1462 + ct7302, znaci prvi ct bi bio konverter u PCM, adau kao dsp na pcm formatu i poslednji ct kao konverter u dsd, i to je vrlo prosto za odraditi ako se u pricu ukljuci i amanero usb kombo koji prima i pcm i dsd, ct takodje prima i pcm i dsd i preko i2s i preko optike, i bilo koji format audio sadrzaja.
Ova 4 otpornika nisu pomogla! Sta se desava? Kada odspojim amanero sa usb racunara krece da bruji na zvucnicima punom snagom, mislio sam da ulazi na kapijama dodavanjem 1M otpornika da ce da drze LOW ali ne pomaze, zbog cega bi moglo da bruji?

[Image: attachment.php?aid=38540]

Edit:
Masa je u pitanju, ne moze bez mase jer onda bruji, znaci dovoljna je neka masa dali sa racunara ili neka druga i onda ne bruji. Ali bez veze mi je, zar nema masu vec preko napajanja?
(09-26-2022, 07:44 PM)savan Wrote: [ -> ]Stavio sam ovde simulaciju i alat za konverziju iz dsd fajla u TinaTI piecevise linear fajl, nekom ce zatrebati sigurno i za nesto trece. Ako neko uspe da razume ili da napravi formulu kako da redjamo bitove za specificnu frekvenciju sinewave bice mi drago da napravim alat koji bi nam generisao dsd fajl direktno, to bi mogli kasnije da koristimo i za neke druge stvari, recimo za neki pdm buck ili nesto trece!

Nasao sam neki pipeline a i formulu koju sam trazio po netu, koji pravi sinevawe na specificnoj frekvenciju i specificnom sample rateu, trazio sam sta mu znaci 16383.0 konstanta i naisao na ovaj sajt jos kopletnije objasnjeno http://manuals.opensound.com/developer/singen.c.html , stavljam ovde cisto da lakse mogu da nadjem kada budem pravio generator sine vawe bitstreama u dsd formatu Smile

Code:
//
// writewav.c - Create a wav file by piping raw samples to ffmpeg
// Written by Ted Burke - last updated 10-2-2017
//
// To compile:
//
//    gcc writewav.c -o writewav -lm
//

#include <stdio.h>
#include <stdint.h>
#include <math.h>

#define N 44100

void main()
{
    // Create audio buffer
    int16_t buf[N] = {0}; // buffer
    int n;                // buffer index
    double Fs = 44100.0;  // sampling frequency
     
    // Generate 1 second of audio data - it's just a 1 kHz sine wave
    for (n=0 ; n<N ; ++n) buf[n] = 16383.0 * sin(n*1000.0*2.0*M_PI/Fs);
     
    // Pipe the audio data to ffmpeg, which writes it to a wav file
    FILE *pipeout;
    pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - beep.wav", "w");
    fwrite(buf, 2, N, pipeout);
    pclose(pipeout);
}

Jedan jos bolji https://www3.nd.edu/~dthain/courses/cse2...3/wavfile/

Sve zajedno moze da se ukombinuje sa https://pcmdsd.com/Software/PCM-DSD_Converter_en.html
Trebali bi prvo da se skoncetrišemo na sam izlaz, famozni L/R DSD bit-stream ako može da se napravi.
Dakle linearni buffer recimo 200MB, unutra je unapred popunjeno šta treba, da kažemo da to nije problem, rade razni konverteri to lepo, treba "samo" da čitamo buffer i izbacujemo serializovano to na izlaz (i dalje je to zahtevno), to je ovde najbitnija stvar, sve ostalo može da se reši.
I da, da ne zaboravim, RPi2 i RPi4 se razlikuju u internom HW, nisu na istim adresama periferije i moguće da nisu iste, nadam se da je ostao na RPi4 PWM sa SERIAL modom + FIFO bufferom, gledao neke primere/drajvere i recimo na novom se te dve stvari ne spominju, da li su zaboravili developeri da dodaju, da li premestena funkcionalnsot, možda je izbačena, ne znam, nešto su tu mućkali, a dokumentacije ni za lek ...

Ovo je BCM2835 drajver verzija 1.71, zadnja sa kojom mi ne radi primeri.
https://www.airspayce.com/mikem/bcm2835/

Ovde je starija verzija koja radi na RPi2 i tu se spominju SERIAL i FIFO za PWM modul, to je primer koji sam probao i koji nekako radi:
https://gitlab.com/HITMAnsOFT/snd-bcm283.../bcm2835.c

Ima i neki patch da se to zakrpi, nisam probao, samo da nadjem ...

BTW: Ako možemo u ovoj RnD fazi da se držimo RPi-ova, to verujem da svi imamo kući po primerak da probamo, može Zero, RPi2, RPi3, RPi4
Sto se mene tice ja sam za rpi. Da Miki rpi4 je isto sto se funkcija tice samo su adrese malo drugacije, pogledaj u ovo sto sam radio https://pastebin.com/qGbernqL , peri base je drugi. i2c takodje, gpio takodje, ali funkcionalnost je ista na svim! Pogledaj dokumenat od rpi4 (BCM2711), tu ima sve potrebno sto se rpi4 tice! Taj dokumenat treba dobro prouciti, bukvalno odraditi sve novo naspram tog dokumenta za barebone, bar tako cu ja da probam, mada ako postoji mogucnost iz userspace jos bolje, mada sumnjam da je bolje!
Da da, to je nova dokumentacija, na sreću vidim da ima SERIAL + FIFO za PWM i kod novog RPi4, to je dovoljno ohrabrujući podatak Smile
Postoji mogucnost da ulaz bude pdm ali je problem sto je izlaz uvek pcm, nista od pcm registra. U pravu si ti, chapter 8 je ono sto nama treba, pwm u serialise mode, ono sto je jos zanimljivije vec nam je pola uradjeno, video si FIF1 register? Jedan fifo na dva kanala:

Quote:For example if the word series A B C D E F G H I .. is written to the FIFO and both channels are active
and configured to use FIFO, then channel 1 will transmit words A C E G I .. and channel 2 will transmit words B D F H
upravo tako dsd ima poredjan levi i desni kanal (8bit_left_ch, 8bit_right_ch.... redom do kraja dsd fajla), tako da bi dsd fajl mogao direktno u ovaj FIF1 da se ucitava a da na jednom kanalu imamo DSD_LEFT_OUT a na drugom DSD_RIGHT_OUT! Jos jedna dobra stvar fifo je 32bit, a nas dsd je 32bit aligned! Tako da bi to trebalo da radi perfektno dobro sa dsd Smile

Edit:
Mozda bi bilo bolje preko SPI? Imali bi vecu kontrolu + softvare interupts

[Image: attachment.php?aid=38541]