PWM Ljud - Kvalite

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

PWM Ljud - Kvalite

Inlägg av arte »

Hej,

Jag håller på att generera ljud via PWM med en FPGA.
I dagsläget spelar jag upp wav filer i 22KHz 8bitar, vilket låter ok.

FPGAns kör på en 50MHz klocka, PWM frekvensen är likadan som samplnigs frekvensen dvs (ungefär) 22KHz.

För att få fram en PWM med 22KHz och en upplösning på 8bitar så delar jag ner klockfrekvensen med 9.

50*10^6 / 9 / 255 = 21.7KHz vilket är nära nog.

Högre än 10bitar 22KHz kvalite på ljudet hade inte gått med nuvarande klockfrekvensen, så är det är väl inte så mycket at göra då.

Vad jag undrar är hur man skall resonera när man väljer PWM-frekvens?

Jag skulle kunna dela ner systemklockan med 8 och få en samplings frekvens på 24kHz (vilket är lite högt kanske?) men åandra sidan så skulle PWM frekvensen kunna ökas till nästan 200KHz
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Borde det inte bli 50*10^6 / 9 / 256?

Jag tror det blir bättre ljud om PWM-frekvensen är högre. Det kanske går att få ljudet i rätt pitch om frekvensen 50M / 256 används och spelar varje sample växlande 8 gånger eller 9 gånger i ett mönster som ger 22050 Hz i medel.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Du vill väl köra en PWM frekvens som är minst 10ggr högre än utfrekvensen. DVS 220500hz
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

Kan du inte köra PWM på 50*10^6 / 256 Hz och sedan ha en räknare som räknar till 50*10^6 / f_sample, och då updatera PWM med ett nytt sample värde. Då borde du få absolut bästa noggrannhet och enklast att filtrera bort PWM-grundtonen eftersom den har högsta möjliga frekvens.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Det var smart. Då bildas mönstret automatiskt.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Inlägg av arte »

Tack för alla svar!

Visst skall det vara 256 och inte 255 skrev fel.
Bortsätt från att PWM frekvensen kan höras, finns det någon annan fördel med att ha en högre PWM frekvens?
Tror att förstärkaren jag använder har ett lågpass filter vid 16KHz och 22KHz går ju ändå inte att höra....eller kan man inte resonera så?
Andax skrev:Kan du inte köra PWM på 50*10^6 / 256 Hz och sedan ha en räknare som räknar till 50*10^6 / f_sample, och då updatera PWM med ett nytt sample värde. Då borde du få absolut bästa noggrannhet och enklast att filtrera bort PWM-grundtonen eftersom den har högsta möjliga frekvens.
Aha smart!
I vissa fall så kommer ju inte PWM cyklen ha hunnit klart innan ett den skall använda ett annat sample. Undra hur det påverkar kvalitén?

Det skall tilläggas att det låter *ok* nu, 22KHz 8bitar är inte speciellt bra :) Men är tacksam för alla synpunkter!
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Inlägg av SvenW »

Bara en tanke...
Om 22KHz 8bitar inte är tillräckligt bra, så borde man kunna göra det bättre genom att använda två eller fler PWM-kanaler och summera dem analogt. En kanal för höga bitar och en för låga bitar.
Att göra två PWM-kanaler med vardera sex bitars upplösning förefaller kräva bara halva processorkraften jämfört med en på kanal med 8 bitars dito. Man borde på så sätt kunna öka både upplösning och PWM-frekvens.
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

http://www.fpga4fun.com/PWM_DAC.html

Har testat den här till ett annat projekt, funkar bra :)
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

RasmusB, det var en smart metod. Den ska jag testa någon gång när jag får tid...
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Jag förstår inte hur den funkar. Jag får det till att signalen blir ungefär 50% duty fyrkantsvåg med en frekvens som är hög med stora samples och låg med små samples.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

Om du tänker hur det funkar för extremfallen 1 och 255 i sample värde:

Fallet 1:
Det innebär att accumulatorn får sin bit 8 att sättas 1 gång per 256 cykel. (1+1+1+1.... = 256 => bit 8 satt, nästa gång är den 0 igen). Ger alltså en dutycykel på 1/256.

Fallet 255:
Om accumulatorn är noll från början så är det bara första gången som bit 8 sätts när man lägger till 255. Andra, tredje, fjärde etc kommer att ha bit 8 satt eftersom accumulatorn då har värdena 255, 254, 253 etc. Efter 255 ggr så har accumulatorn åter värdet 0 och man får bit 8 satt till noll igen. Dvs en dutycykel på 255/256.

För sample värden mellan 1 och 255 får man sett över 256 clockcykler en dutycykel på samplevärdet/256. Nollorna och ettorna kommer dock inte i en rak föjd under dessa 256 clockcykler.

Observera att det är det faktum att bit 8 nollställs innan summationen varje cykel som gör att det fungerar....
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Andax skrev:Kan du inte köra PWM på 50*10^6 / 256 Hz och sedan ha en räknare som räknar till 50*10^6 / f_sample, och då updatera PWM med ett nytt sample värde. Då borde du få absolut bästa noggrannhet och enklast att filtrera bort PWM-grundtonen eftersom den har högsta möjliga frekvens.
Håller med om att man bör köra så hög PWM-frekvens som möjligt i detta fallet. Vill man fila till det sista kan man börja interpolera mellan PWM-uppdateringarna. Vidare så bör man försöka ha symmetrisk PWM (låta räknare gå baklänges varannan gång) för att få ett bättre frekvesspektra, det öppnar dessutom för komplementära (bryggade) utgångar då man erhåller en dubblad effektiv switchfrekvens med två identiska PWM-utkanaler.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

Skönheten med metoden som stod på fpga4fun är ju att den automatiskt interpolerar mellan samples eftersom restvärdet ligger kvar i accumulatorn.
RasmusB, tack än en gång för en toppenlänk!
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: PWM Ljud - Kvalite

Inlägg av overclocked »

arte skrev: FPGAns kör på en 50MHz klocka, PWM frekvensen är likadan som samplnigs frekvensen dvs (ungefär) 22KHz.

Högre än 10bitar 22KHz kvalite på ljudet hade inte gått med nuvarande klockfrekvensen, så är det är väl inte så mycket at göra då.

Varför kör du helt enkelt inte högre klocka så du kan öka både bitar och klockan på din sample-uppspelning? Jag antar av din 50Mhz angivelse att du kör något av Xilinx/Digilent-Development kort, som jag också har två versioner av. När jag sitter och labbar med olika kretsar/konstruktioner och verkligen vill prova konstruktioner i närheten av den max-frekvens som anges av Xilinx ISE-verktyg så använder jag mig av en/flera DCM:er. Jag antar att du känner till dessa och en enkel PWM-krets max frekvens ligger väl långt över 50Mhz även om det är en Spartan-3 speedgrade-4. Jag gissar 120Mhz+ åtminstone vilket enkelt fixas med en DCM ställd till termerna 12/5
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Blanda inte ihop PCM och PWM bara...

PWM-audio 10-15 ggr önskad högsta frekvens du vill återge

PCM-audio ungefär 2ggr högsta frekvensen du vill återge.
Skriv svar