Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ErikHK
Inlägg: 27
Blev medlem: 18 november 2009, 02:25:06

Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av ErikHK »

Jag har enbart lyckats generera vanliga fyrkantsvågor med hjälp av PWM på en atmega-processor, vilket inte blir så roligt ljud om man tar det till en högtalare, hur ska man gå till väga för att t.ex. skapa sinus-, sågtands- och triangelvågor? Eller rent av syntetisera t.ex. piano- eller xylofonljud?

Jag förstår principen av den här bilden, men inte exakt hur jag ska implementera det. Tack på förhand!
sodjan
EF Sponsor
Inlägg: 43244
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av sodjan »

OK, den där bilden visar hur man kan producera andra vägformer genom att
ändra pulsvidd förhållanden kontinuerligt. Problemet med en vanlig AVR (eller PIC)
processor är att du inte hinner med att ändra det tillräckligt snabbt för att
det ska vara någon större mening med det (annat än för rellativt låga frekvenser).
PWM generatorn är helt enkelt inte tänkt för det.

Så svaret är sannolikt separata ljudgeneratorer av något slag.
Eller en processor med lite bättre DSP egenskaper (dsPIC eller liknande).
Användarvisningsbild
4kTRB
Inlägg: 20522
Blev medlem: 16 augusti 2009, 19:04:48

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av 4kTRB »

Om du har 2 PWM utgångar/signaler så kan du alltid summera dom
i en extern krets, tex lägg ihop en 400Hz med en 1500Hz så
får du en tvåtons signal. Ska du ha en tvåtons PWM ut direkt
måste du signalbehandla i koden.

Om du har en u-controller som är programmerad att ge pwm med
3 olika frekvenser på 3 olika utgångar kan du koppla in dom på
var sin ingång på en annan u-controller och i den utföra summering
av de 3 signalerna och skicka ut resultatet på en utgång i form
av en pwm och LP-filtrera för lite trevligare ljud.
ErikHK
Inlägg: 27
Blev medlem: 18 november 2009, 02:25:06

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av ErikHK »

4kTRB: Menar du för att få fler voices på ljudet eller? Eller menar du för att överkomma problemet sodjan tar upp?
Användarvisningsbild
4kTRB
Inlägg: 20522
Blev medlem: 16 augusti 2009, 19:04:48

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av 4kTRB »

Den ena processorn kan leverera grundsignaler
som är inställbara, tex frekvensen kan justeras
för varje signal. Den andra processor får jobbet
att signalbehandla, addera, justera nivåer, modulera
osv. Vågformer kan du bygga upp med hjälp av
Fourier matematik.

Testa den här appleten http://www.falstad.com/fourier/
peka på de vita staplarna så ser du vilka frekvenser som ingår i olika kurvformer.
Ju fler frekvenser desto bättre kurvor.
Användarvisningsbild
matkrig
Inlägg: 84
Blev medlem: 23 mars 2009, 15:22:55

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av matkrig »

Sen kanske man får ha en fetare processor om man ska göra nån avancerad syntes eller så, men pwm:en på atmega hinner med utan problem för ljud iaf. det är ju bara ett register som behöver sättas för att skicka ut en ny sampel.

Se även en appnote från Atmel som heter något med "high-speed pwm".
Användarvisningsbild
Icecap
Inlägg: 26624
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av Icecap »

Det finns ju faktisk PWM som är anpassat till detta eller rättare: till att göra vågformar till drivning av motorer. Där skapar man en tabell som sedan "spelas upp".

Men hela grejen är att med det "nuvarande" sätt är INTE en PWM, det är en timer-frekvens.

Ska du lösa det med PWM ska PWM-frekvensen dels vara en del högre än den högsta frekvens du vill alstra och dels ska du skriva nya värden så pass snabbt att det genererar tonerna.

Säg att du ska skicka ut en 1kHz "sinus" med 16* översampling, bara ett räknaexempel.
PWM-frekvensen ska då vara (minst!) 16kHz och du måste skicka nya värden till den med en frekvens om 16kHz.
För att göra en svängning ska du då skicka (räknar 8-bit PWM):
177, 218, 245, 255, 245, 218, 177, 128, 79, 38, 11, 1, 11, 38, 79, 128
På det vis har du fått en sinussvängning. Självklart måste du filtrera det hela lite och en "mycket" högre PWM-frekvens är att föredra, det ger enklare filtrering.
Nerre
Inlägg: 27175
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av Nerre »

Ja det handlar ju i princip om att man gör ett PWM-pulståg som får en massa övertoner, och så med ett lågpassfilter filtrerar man ut de under en viss frekvens. Varje PWM-puls får motsvara max "ett sample" av den vågform man vill generera (det bästa är nog flera PWM-pulser per sample).

Man ser det som en D/A-omvandlare där PWM-pulsen styr nivån på varje sampel.

Har du en utgång som switchar mellan 0 och 10 V så ger ju 50% PWM en "medelspänning" på 5 V.
sodjan
EF Sponsor
Inlägg: 43244
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av sodjan »

> men pwm:en på atmega hinner med utan problem för ljud iaf.

Är du säker på att du kollade den metod som erikHK länkade till ?
Eller menar du bara att generera "toner" rent generellt ? I så
fall var det ju det som erikHK inte ville göra riktigt.
limpan4all
Inlägg: 8435
Blev medlem: 15 april 2006, 18:57:29
Ort: Typ Nyköping

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av limpan4all »

ErikHK: Den där bilden har inget med CPU genererad PWM att göra alls, utan har med analogt genererad PWM för att t.ex skapa klass D förstärkare med en analog insignal.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av Andax »

Sodjan, vaför skulle det inte hinnas med att generera ljud på en atmega. Säg att man kör med 16 MHz PWM räknarfrekvens, och 256 stegs PWM upplösning. då har man en hel PWM cykel med 62.5 kHz. Då räcker det med ett ganska enkelt lågpassfilter för att får hyffsat ljud upp till kanske 6kHz om man tänker sig 10 ggr översampling.
Vissa Atmel MCU har en inbyggd PLL så att man kan få upp PWM till 64 MHz (räknarfrekvensen). (Tiny15 etc)

ErikHK. Här finns en intressant appnote.

Limpan4all, principen i bilden är ju samma som finns inne i en MCU så den är väl enligt mitt tycke väldigt relevant. PWM-generatorn har ju oftast en räknare som kan liknas med triangelvågen i bilden och sedan en komparator för att ge önskad pulsbredd. Var ligger skillnaden menar du?
Användarvisningsbild
matkrig
Inlägg: 84
Blev medlem: 23 mars 2009, 15:22:55

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av matkrig »

Icecap, Sodjan: ja, alltså, det blir ju inte hifi precis men såvida OP kan leva med att hans xylofonsynt inte hamnar i referensklassen lär det vara lugnt. Misstänker att det inte var ambitionen ändå, hehe. Kolla länken, det är om inte njutbart så åtminstone fullt hörbart och han kör inte ens med den snabba PWMen.

ErikHK: gör din grej, det funkar & 8-bitssampling är punk.
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av E85 »

Jag har spelat upp 8-bit musik på ATmega168 med ganska bra resultat. Satt en interruptrutin som kördes i ex 22050Hz som läste in ljuddata från en ringbuffer och uppdaterade PWM-utgångens värde. Ringbuffern fylldes i main-loopen genom att läsa wav från minneskort.
AVR:en läste in samplingsfrekvensen från wave-headern och satt automatiskt interrupttiden så det gick att spela flera olika ljudkvalitéer.
Seminumerical
Inlägg: 8
Blev medlem: 31 januari 2010, 19:37:52

Re: Generera mer komplexa (än fyrkantsvåg) ljud med PWM?

Inlägg av Seminumerical »

Har du möjlighet att dedikera åtta portar kan du ju skicka ett helt sampel via ett R-2R nät då får du trappstegsformade vågor.
http://en.wikipedia.org/wiki/Resistor_ladder
Både enklare att generera och filtrera.

EDIT: Fast då är det ju inte PWM längre förståss...
Skriv svar