Generator för rosa brus - miniprojekt
Generator för rosa brus - miniprojekt
Hej allihopa, det här mitt första inlägg här. Jag registrerade mej för (väldigt) länge sen men det har liksom inte blivit av att skriva någonting - förrän nu! Nu har jag ett litet projekt på gång och hoppas det är ok att jag dokumenterar det här?
Som det står i rubriken så ska det alltså bli en en brusgenerator för rosa/skärt brus. Jag ska använda den till att maskera tinnitus-ljud på natten. En dator drar för mycket el och en mp3-spelare kostar för mycket och äter batterier. Elfa och Electrokit har visserligen en Velleman-byggsats, men den är också ganska dyr och det är ju ändå roligare att konstruera nåt eget.
Jag har inte kommit så långt ännu, men kretsen ska i alla fall bli så liten som möjligt med hjälp av en 8-pinnars mikrocontroller (AVR eller PIC) som eventuellt också använder en PWM-utgång som DAC.
Här är min kvällsläsning - all teori som behövs, hoppas jag:
http://en.wikipedia.org/wiki/Linear_fee ... t_register
http://www.firstpr.com.au/dsp/pink-noise/
http://home.earthlink.net/~ltrammell/tech/pinkalg.htm
http://home.earthlink.net/~ltrammell/tech/newpink.htm
/Andreas
Som det står i rubriken så ska det alltså bli en en brusgenerator för rosa/skärt brus. Jag ska använda den till att maskera tinnitus-ljud på natten. En dator drar för mycket el och en mp3-spelare kostar för mycket och äter batterier. Elfa och Electrokit har visserligen en Velleman-byggsats, men den är också ganska dyr och det är ju ändå roligare att konstruera nåt eget.
Jag har inte kommit så långt ännu, men kretsen ska i alla fall bli så liten som möjligt med hjälp av en 8-pinnars mikrocontroller (AVR eller PIC) som eventuellt också använder en PWM-utgång som DAC.
Här är min kvällsläsning - all teori som behövs, hoppas jag:
http://en.wikipedia.org/wiki/Linear_fee ... t_register
http://www.firstpr.com.au/dsp/pink-noise/
http://home.earthlink.net/~ltrammell/tech/pinkalg.htm
http://home.earthlink.net/~ltrammell/tech/newpink.htm
/Andreas
- JimmyAndersson
- Inlägg: 26308
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Välkommen till tinnitusklubben.
Lägger till några brus-trådar:
http://elektronikforumet.com/forum/view ... p?p=205255
http://elektronikforumet.com/forum/view ... p?p=164221
Det ska bli intressant att följa den här tråden och se om det maskerar tinnitus-ljuden tillräckligt.
För egen del så har jag lärt mig att leva med det, men visst är det trist att det aldrig är tyst.
Lägger till några brus-trådar:
http://elektronikforumet.com/forum/view ... p?p=205255
http://elektronikforumet.com/forum/view ... p?p=164221
Det ska bli intressant att följa den här tråden och se om det maskerar tinnitus-ljuden tillräckligt.
För egen del så har jag lärt mig att leva med det, men visst är det trist att det aldrig är tyst.
Tack för länkarna, och för medlemskapet eller eh, öh... jag hade ju hellre varit stödmedlem än fullvärdig om man säger så. Min tinnitus är ganska måttlig som tur är, det vanligaste ljudet låter som en CRT-TV piper ungefär och det är ganska lätt att maskera eller t.o.m glömma bort ibland. Fast tyst blir det ju aldrig, nä... och det var inte roligt i början.
Hur låter det för dej? Är det så att du hör det jämt, t.ex ute i trafiken eller så?
Ok, vidare med projektet:
Det hann inte bli så mycket läsande ikväll, jag började med att testa den här generatorn för vitt brus istället. Den finns i en Wikipedia-artikel av alla ställen.
Om man antar att den har en cykel på 2^32 bitar tar det ca en och en halv timme vid 48 kHz samplingsfrekvens och 16-bitars samples innan den börjar upprepa sig och det borde räcka!
Jag genererade 100 sekunder (16-bit, 44.1kHz) i ett litet program, sparade till en fil och stoppade in ljudfilen i en spektrumanalysator och kan konstatera att det fungerar hyfsat.
Markerar man 10 sekunder av ljudet så ritar analysatorn en brusig men vågrät linje runt -50dB över hela spektrumet, med de flesta variationerna inom +/-0.5 dB. Det finns några större utliggare, säg max +/-1 dB avvikelse. Markerar man 100 sekunder så blir variationen kanske hälften så stor. Sen får jag lite olika resultat beroende hur analysatorn är inställd.
Det blir t.ex. skumma kurvor om frekvensaxeln är logaritmisk - då blir inte linjen lika rät längre och variationerna blir större vid låga frekvenser. Fast har man inga särskilda krav så får det duga med hur det ser ut med en linjär axel. Och säger teoretikerna att en sån här generator skapar helt vitt brus så får man väl tro dem!
Hur låter det för dej? Är det så att du hör det jämt, t.ex ute i trafiken eller så?
Ok, vidare med projektet:
Det hann inte bli så mycket läsande ikväll, jag började med att testa den här generatorn för vitt brus istället. Den finns i en Wikipedia-artikel av alla ställen.
Om man antar att den har en cykel på 2^32 bitar tar det ca en och en halv timme vid 48 kHz samplingsfrekvens och 16-bitars samples innan den börjar upprepa sig och det borde räcka!
Kod: Markera allt
unsigned int lfsr = 1;
while(1) {
lfsr = (lfsr >> 1) ^ (-(signed int)(lfsr & 1) & 0xd0000001u);
}
Markerar man 10 sekunder av ljudet så ritar analysatorn en brusig men vågrät linje runt -50dB över hela spektrumet, med de flesta variationerna inom +/-0.5 dB. Det finns några större utliggare, säg max +/-1 dB avvikelse. Markerar man 100 sekunder så blir variationen kanske hälften så stor. Sen får jag lite olika resultat beroende hur analysatorn är inställd.
Det blir t.ex. skumma kurvor om frekvensaxeln är logaritmisk - då blir inte linjen lika rät längre och variationerna blir större vid låga frekvenser. Fast har man inga särskilda krav så får det duga med hur det ser ut med en linjär axel. Och säger teoretikerna att en sån här generator skapar helt vitt brus så får man väl tro dem!
välkommen i klubben du också... för min del... efter 13 dygn där man blev väckt i panikångest med adrenalinet rinnande ur örona av stora brandlarmsklockor av klassisk typ så fort man somnade - gång på gång natten igenom, natt efter natt, så började jag förstå varför varför folk funderar på att ta livet av sig - den 14:e natten så begrep hjärnan äntligen att ringandet i örona (efter en olycksalig discobesök) inte betydde att huset höll på att brinna ned och man skulle fly för livet, och var nog en av mitt livs skönaste nattsömn - nu efter hand har hjärnan lyckats filtrera bort det mesta från medvetande, men som andra redan nämt, fylla, mediciner, feber och förkylning så slutar hjärnfiltret att fungera delvis och det hela blir ganska påtagligt...
tinnitus går inte att droga eller supa bort utan blir bara värre - möjligen kan man påverka med droger om man bryr sig eller inte...
Efter en sådan pärs så är man väldigt noga med att ha med sig hörselproppar när man skall ut på partaj, och stoppa in dessa i örona vid minsta lilla hörseltrötthet eller att man blir medveten att man har utsats för lite höga ljudnivåer en längre tid. Man har liksom redan förbrukat sin sista chans och en stor hörselskada till så kommer den att hålla sällskap med sinnet för resten av livet...
När skadan var ny så tålde jag heller inte CRT-monitorer - dom hördes i nästan plågsam nivå på 30 meters håll och det pep högt var man än gick i tex. tågstationer och perrongområden - man kan fråga sig varför man får sådan superhörsel just vid hörseskada när man normalt (innan) knappt hörde dessa alls ens när man var intill dessa...
tinnitus går inte att droga eller supa bort utan blir bara värre - möjligen kan man påverka med droger om man bryr sig eller inte...
Efter en sådan pärs så är man väldigt noga med att ha med sig hörselproppar när man skall ut på partaj, och stoppa in dessa i örona vid minsta lilla hörseltrötthet eller att man blir medveten att man har utsats för lite höga ljudnivåer en längre tid. Man har liksom redan förbrukat sin sista chans och en stor hörselskada till så kommer den att hålla sällskap med sinnet för resten av livet...
När skadan var ny så tålde jag heller inte CRT-monitorer - dom hördes i nästan plågsam nivå på 30 meters håll och det pep högt var man än gick i tex. tågstationer och perrongområden - man kan fråga sig varför man får sådan superhörsel just vid hörseskada när man normalt (innan) knappt hörde dessa alls ens när man var intill dessa...
- JimmyAndersson
- Inlägg: 26308
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
andr3as:
"Hur låter det för dej? Är det så att du hör det jämt, t.ex ute i trafiken eller så?"
När jag är ute på stan och liknande så tänker jag inte på det alls. Men annars hör jag det alltid. Jag har lärt mig att acceptera att det finns där och det har gjort att tinnitus-volymen har minskat. Men när jag koncentrerar mig på det så ökar det väldigt mycket och blir riktigt jobbigt.
Samma dag som jag fick tinnitus så hade jag mixat några låtar på väldigt hög volym i lurarna. Efter flera timmars jobbande så tyckte jag att lurarna var diskantfattiga, så jag kopplade in en apparat som lägger till mer diskant (exciter). Efter flera timmar tog jag en paus och gick ut på balkongen. Jag bodde då precis vid en skog och det brukade vara tyst, men då hörde jag ett högfrekvent pipande. Jag fick en konstig känsla i magen och förstod direkt att jag hade fått tinnitus och att det inte skulle försvinna, som det annars gjort om jag någon gång slarvat med öronproppar efter ett discobesök. När jag vaknade dagen efter så var ljudet fortfarande kvar, så det var bara att acceptera det som en del av mig.
6-7 år senare så hade jag jobbat för mycket under flera år, så jag blev utbränd. Då ökade tinnitus'en. Läste att om man kan påverka tinnitus'en genom att spänna käk/nack-musklerna så beror den på muskelspänningar och nerver som hamnar för nära hörselnerverna. Detta går ofta att mildra eller bota med t.ex akupunktur mm. Men jag har inte provat det.
Så jag har alltså både musik-relaterad och muskel-relaterad tinnitus.
Det kan ställa till lite problem när jag mixar låtar eftersom tinnitus'en maskerar frekvenserna över ca 10kHz. Så jag får helt enkelt lita på spektrumanalysatorn. Lyckligtvis hade jag jobbat med detta så länge innan jag fick tinnitus att jag har lärt mig hur det ska låta även om jag inte hör ända upp till 22kHz. Lite som att någon som blivit blind i vuxen ålder ändå kan skriva sitt namn med vanligt papper och penna.
Ibland kan någon säga "usch, vad den där CRT-monitorn låter". Jag hör det inte alls... Eller rättare sagt, jag hör ett likadant pip dygnet runt.
Det enda som är jobbigt för öronen är om jag hör något (musik/tal/ljud) som är på tok för komprimerat. Särskillt om det är på väldigt låg volym. Så vissa radiokanaler är inte alls roliga att lyssna på i bakgrunden. Det gör nästan ont.
"Hur låter det för dej? Är det så att du hör det jämt, t.ex ute i trafiken eller så?"
När jag är ute på stan och liknande så tänker jag inte på det alls. Men annars hör jag det alltid. Jag har lärt mig att acceptera att det finns där och det har gjort att tinnitus-volymen har minskat. Men när jag koncentrerar mig på det så ökar det väldigt mycket och blir riktigt jobbigt.
Samma dag som jag fick tinnitus så hade jag mixat några låtar på väldigt hög volym i lurarna. Efter flera timmars jobbande så tyckte jag att lurarna var diskantfattiga, så jag kopplade in en apparat som lägger till mer diskant (exciter). Efter flera timmar tog jag en paus och gick ut på balkongen. Jag bodde då precis vid en skog och det brukade vara tyst, men då hörde jag ett högfrekvent pipande. Jag fick en konstig känsla i magen och förstod direkt att jag hade fått tinnitus och att det inte skulle försvinna, som det annars gjort om jag någon gång slarvat med öronproppar efter ett discobesök. När jag vaknade dagen efter så var ljudet fortfarande kvar, så det var bara att acceptera det som en del av mig.
6-7 år senare så hade jag jobbat för mycket under flera år, så jag blev utbränd. Då ökade tinnitus'en. Läste att om man kan påverka tinnitus'en genom att spänna käk/nack-musklerna så beror den på muskelspänningar och nerver som hamnar för nära hörselnerverna. Detta går ofta att mildra eller bota med t.ex akupunktur mm. Men jag har inte provat det.
Så jag har alltså både musik-relaterad och muskel-relaterad tinnitus.
Det kan ställa till lite problem när jag mixar låtar eftersom tinnitus'en maskerar frekvenserna över ca 10kHz. Så jag får helt enkelt lita på spektrumanalysatorn. Lyckligtvis hade jag jobbat med detta så länge innan jag fick tinnitus att jag har lärt mig hur det ska låta även om jag inte hör ända upp till 22kHz. Lite som att någon som blivit blind i vuxen ålder ändå kan skriva sitt namn med vanligt papper och penna.
Ibland kan någon säga "usch, vad den där CRT-monitorn låter". Jag hör det inte alls... Eller rättare sagt, jag hör ett likadant pip dygnet runt.
Det enda som är jobbigt för öronen är om jag hör något (musik/tal/ljud) som är på tok för komprimerat. Särskillt om det är på väldigt låg volym. Så vissa radiokanaler är inte alls roliga att lyssna på i bakgrunden. Det gör nästan ont.
OKej, det tråkiga är att jag är bara 17 år gammal... Har altså haft det sen jag var 8-9 år och jag hör det ganska starkt också... jag tycker att *surr* och sånt förstärker det, typ datorfläktar och sånt, men detdär med CRT-skärmar har jag aldrig märkt av. men det är väl som JimmyAndersson säger, "jag hör ett likadant pip dygnet runt"
Det verkar som om det finns fler "medlemmar" än vad man tror. Fast det kan ändå vara svårt att förstå hur jobbigt det kan vara i början för de som inte har tinnitus.
Den första läkaren (visserligen en läkarstudent) jag träffade efter skadan sa i princip "skyll dig själv". Och visst ... det var sant, men inte vad man behöver höra när man funderar på att hoppa från en bro för att bli av med ljudet. De första veckorna hade jag ett ordentligt brusljud som lät som ett vattenledningsrör inne i en vägg. Sen lade sig det mesta av det som tur var och nu piper det bara.
Spinxen: Japp, det är samma här. Det är nästan så man borde bli hifi-entusiast.
xxargs: Jag hade också superhörsel i början - tv-apparater, lysrörsarmaturer och framförallt gnisslande bromsar hördes otroligt tydligt i flera veckor. Lite ljudöverkänslighet finns fortfarande kvar. Vardagsljud fungerar ok, men starkare musik (gissar 90dB+) eller applåder behöver öronproppar.
JimmyAndersson: Det är förmodligen ingen bra idé för öronen, men om mäter upp sin hörselnedsättning (dvs tinnitusen) noga - nogrannare än öronläkaren - hela vägen upp till 20kHz, så kan man kanske skapa ett filter/eq-kurva som kompenserar. Alltså som en hörapparat, fast i studion.
Hursomhelst, jag har faktiskt pysslat lite med brusgeneratorn också sen sist. Jag delar upp det och lägger det i nästa inlägg.
Den första läkaren (visserligen en läkarstudent) jag träffade efter skadan sa i princip "skyll dig själv". Och visst ... det var sant, men inte vad man behöver höra när man funderar på att hoppa från en bro för att bli av med ljudet. De första veckorna hade jag ett ordentligt brusljud som lät som ett vattenledningsrör inne i en vägg. Sen lade sig det mesta av det som tur var och nu piper det bara.
Spinxen: Japp, det är samma här. Det är nästan så man borde bli hifi-entusiast.
xxargs: Jag hade också superhörsel i början - tv-apparater, lysrörsarmaturer och framförallt gnisslande bromsar hördes otroligt tydligt i flera veckor. Lite ljudöverkänslighet finns fortfarande kvar. Vardagsljud fungerar ok, men starkare musik (gissar 90dB+) eller applåder behöver öronproppar.
JimmyAndersson: Det är förmodligen ingen bra idé för öronen, men om mäter upp sin hörselnedsättning (dvs tinnitusen) noga - nogrannare än öronläkaren - hela vägen upp till 20kHz, så kan man kanske skapa ett filter/eq-kurva som kompenserar. Alltså som en hörapparat, fast i studion.
Hursomhelst, jag har faktiskt pysslat lite med brusgeneratorn också sen sist. Jag delar upp det och lägger det i nästa inlägg.
Jag misstänkte att det här skulle vara en bra algoritm: http://home.earthlink.net/~ltrammell/tech/newpink.htm och det är det. Nu kan testprogrammet generera rosa brus som ser rätt bra ut på spektrumanalysatorn.
Om man ska beskriva hur programmet arbetar utan att försöka förklara hur matematiken fungerar så är det väl nåt sånt här:
Man använder 5 st register (variabler). När ett nytt rosa brus-sample ska skapas väljs slumpmässigt ett av de 5 registren ut och uppdateras med ett nytt slumptal som multiplicerats med en konstant. Sen summeras alla register och bildar då ett nytt sample. Slumptalen är "vita" förstås.
Nu behöver man inte lägga ihop alla register varje varv. Man kan spara några additioner genom att dra av det gamla värdet i registret man ska updatera, från summan, och sen lägga till det nya.
Min egenhändiga C-kod ser ut så här, variabelnamnen kommer från artikeln i länken:
contrib[] är registren, genout är summan. Rand() är en funktion som genererar slumptal (flyttal) mellan 0.0 och 1.0.
Sådär... nästa steg är att göra en heltalsversion! Jag har en optimeringsidé att prova också.
Om man ska beskriva hur programmet arbetar utan att försöka förklara hur matematiken fungerar så är det väl nåt sånt här:
Man använder 5 st register (variabler). När ett nytt rosa brus-sample ska skapas väljs slumpmässigt ett av de 5 registren ut och uppdateras med ett nytt slumptal som multiplicerats med en konstant. Sen summeras alla register och bildar då ett nytt sample. Slumptalen är "vita" förstås.
Nu behöver man inte lägga ihop alla register varje varv. Man kan spara några additioner genom att dra av det gamla värdet i registret man ska updatera, från summan, och sen lägga till det nya.
Min egenhändiga C-kod ser ut så här, variabelnamnen kommer från artikeln i länken:
Kod: Markera allt
double contrib[5];
double genout;
double GetPinkValue()
{
const double pA[5] = { 3.80240, 2.96940, 2.59700, 3.08700, 3.40060 };
const double pSum[5] = { 0.00198, 0.01478, 0.06378, 0.23378, 0.91578 };
const double pASum = 15.8564;
int i;
for (i = 0; i < 5; i++)
{
if (Rand() < pSum[i])
{
genout -= contrib[i];
contrib[i] = 2 * (Rand() - 0.5) * pA[i];
genout += contrib[i];
break;
}
}
return genout / pASum;
}
Sådär... nästa steg är att göra en heltalsversion! Jag har en optimeringsidé att prova också.
Dags för en stor uppdatering. Det gick att optimera generatorn löjligt mycket...
Jag tänkte att om Rand() i den här raden,
contrib = 2 * (Rand() - 0.5) * pA;
som ju skapar ett flyttals-slumptal mellan 0.0 och 1.0, byttes ut mot en slumptalsfunktion som bara genererar en binär nolla eller etta, så skulle man kanske fortfarande få ungefär samma resultat. En brusgenerator som den Elfa säljer, har ju bara en enda logikutgång med ett RC-filter påhängt och kan ändå producera ett bra brus, så varför inte?
Ett test senare, bekräftar spektrumanalysatorn att det funkar finemang! Spektrumet blir lite annorlunda jämfört med tidigare, men det är fortfarande rosa. Jag kan definitivt inte *höra* någon skillnad och det är ju det som räknas.
Vad medför det här nu då?
Jo, slumptalsgenereringen går dubbelt så fort och multiplikationen och additionerna går bort. De utförs analogt med en 5-bits DAC med specialberäknade resistanser. PWM behövs inte.
Så nu sitter jag här och är sjukt nöjd med mig själv. Det är inte varje dag man hittar en så här snygg lösning!
Jag var orolig ett tag att det skulle behövas en mikrokontroller modell snabb (> 20MHz), men inte nu längre.
Så här kommer den färdiga algoritmen, med schema:
Så nu återstår att välja mikrokontroller och skriva om koden till assembler, innan det är dags att bygga. Hoppas jag inte gjort nåt tankefel eller räknefel nu.
Jag tänkte att om Rand() i den här raden,
contrib = 2 * (Rand() - 0.5) * pA;
som ju skapar ett flyttals-slumptal mellan 0.0 och 1.0, byttes ut mot en slumptalsfunktion som bara genererar en binär nolla eller etta, så skulle man kanske fortfarande få ungefär samma resultat. En brusgenerator som den Elfa säljer, har ju bara en enda logikutgång med ett RC-filter påhängt och kan ändå producera ett bra brus, så varför inte?
Ett test senare, bekräftar spektrumanalysatorn att det funkar finemang! Spektrumet blir lite annorlunda jämfört med tidigare, men det är fortfarande rosa. Jag kan definitivt inte *höra* någon skillnad och det är ju det som räknas.
Vad medför det här nu då?
Jo, slumptalsgenereringen går dubbelt så fort och multiplikationen och additionerna går bort. De utförs analogt med en 5-bits DAC med specialberäknade resistanser. PWM behövs inte.
Så nu sitter jag här och är sjukt nöjd med mig själv. Det är inte varje dag man hittar en så här snygg lösning!
Jag var orolig ett tag att det skulle behövas en mikrokontroller modell snabb (> 20MHz), men inte nu längre.
Så här kommer den färdiga algoritmen, med schema:
Kod: Markera allt
unsigned int lfsr = 1;
int U = 0;
int Rand1()
{
int x = lfsr & 1;
lfsr = (lfsr >> 1) ^ (-(signed int)(lfsr & 1) & 0xd0000001u);
return x;
}
int Rand2()
{
int i;
int x = 0;
for (i = 0; i < 13; i++)
{
x = (x << 1) | Rand1();
}
return x;
}
int GetPinkValue()
{
const int pSum[] = { 16, 121, 522, 1915, 7501 };
int i;
for (i = 0; i < 5; i++)
{
if (Rand2() < pSum[i])
{
U &= ~(1 << i);
U |= Rand1() << i;
break;
}
}
return U;
}
/* DAC-schema
R0
U0 o--XXXX--*--*---o Uout
R1 | |
U1 o--XXXX--* |
R2 | X
U2 o--XXXX--* X Rs
R3 | X
U3 o--XXXX--* |
R4 | |
U4 o--XXXX-- ---
GND
Rs = 10k
Rk = Rs / (pA[k] / pASum), k = 0..4.
Exakt res. E24 fel E96 fel
R0 41701.030928 39.0k + 2.7k 0.00% 42.2k 1.20%
R1 53399.339934 51.0k + 2.4k 0.00% 53.6k 0.38%
R2 61056.603774 51.0k + 10.0k 0.09% 60.4k -1.07%
R3 51365.079365 51.0k + 360 0.01% 51.1k -0.52%
R4 46628.242075 43.0k + 3.6k -0.06% 46.4k -0.49%
Rout = 5k