PWM Ljud - Kvalite
PWM Ljud - Kvalite
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
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
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å?
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!
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å?
Aha smart!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.
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

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.
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.
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....
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....
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.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.
-
- Inlägg: 71
- Blev medlem: 13 juni 2006, 21:34:24
- Ort: Gävle
Re: PWM Ljud - Kvalite
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