Stereoljud med Arduino (6 / 7 steg)
Steg 6: Binaural Beats med Arduino
Binaural beats är en intressant effekt av att skicka två sinustoner av lite olika frekvenser till hörlurar (en sinus våg till varje öra). Lyssna på här för ett exempel (du måste lyssna med hörlurar). När du lyssnar på detta exempel, försök lyssna på bara en hörlurar av sig själv och sedan den andra. Här hittar du de ljud som kommer ut varje kanal är pure sine vågor av lite olika frekvenser, som när du lyssnar på dem tillsammans du uppfattar en pulserande effekt. Många tror att vissa kombinationer av frekvenser hjälpa till med fokus, meditation, sömn och andra hjärnaktiviteterna. Jag vet inte tillräckligt om binaural beats att kommentera detta, men jag är intresserad av det faktum att denna pulserande effekt finns i första hand.
Om du någonsin försökt att ställa in ett instrument, kan du vara bekant med begreppet beatnotes (även kallad dissonans anteckningar). När du hör två frekvenser som är mycket nära varandra börjar du höra en pulserande tremolo effekt (kallas en "beat"). Denna effekt förklaras enkelt av störningar mellan de två liknande vågorna. I
bild kan du se två vågor av mycket lika frekvenser på botten och deras summa på toppen, märker hur top signalen varierar i amplitud över tiden, är detta beat anteckningen. Frekvensen av beat är lika med skillnaden mellan de två frekvenserna. Till exempel om du spelar en 300hz och 305hz signal på samma gång, du kommer att höra en 5hz beat. Som du finjustera 305hz signalen närmare till 300hz signalen, du kommer att höra takten sakta ner och så småningom försvinna när de två frekvenserna är lika, här är ett exempel. Intressanta med binaural beats är att de två signalerna aldrig fysiskt blandas som de är för slå anteckningar jag just har beskrivit, i binaural beats varje frekvens skickas separat till ena örat. Alla signal blandning för att producera något liknande en beatnote händer inuti våra hjärnor, till synes av störningar av de elektriska och kemiska signaler som kommer från varje öra.
Om du vill ställa in det ökat jag upplösningen av den lagrade sinusfunktion till 1000 prover genom att köra följande Python skript och spara matrisen med värden i min Arduino kod:
importera matematik
x i rad (0, 1000):
skriva ut str(int(127+127*math.sin(2*math.pi*x*0.001)),)+str(","),
Jag skickade sinustoner ut varje kanal på samma sätt till steg 4, men istället jag ökar index variabler för varje sinusvåg med olika belopp för varje avbrott cykel. Till exempel:
index1 += 10.
ökar värdet för variabeln index1 tio varje gång ett nytt värde för sine skickas till DACA. Frekvensen av den resulterande vågen beräknas enligt följande:
frekvens = [(avbrott frekvens) *(index incrementation)] / [(prover i sine array) *(number of channels)]
frekvens = [88398 * 10)] [1000 * 2] = 442 Hz
öka inex1 och index2 i lite olika takt, kan du skicka annan frekvens sinusvågor (440 och 480 hz i det här exemplet) ut varje kanal gör DAC.
< pre > //binaural slår stereoljud med 44,1 kHz samplingsfrekvens
av Amanda Ghassaei
Nov 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*/
#include < avr/pgmspace.h >
kontroll stift på TLC7528
#define outputSelector 8
#define CS 9
#define WR 10
1000 värden av sinus, centrerad på 127, amplitud på 127
byte [] sine PROGMEM = {127, 127, 128, 129, 130, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 146, 147, 148, 149, 150, 150, 151, 152, 153, 153, 154, 155, 156, 157, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171 , 172, 173, 173, 174, 175, 175, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 183, 184, 185, 186, 186, 187, 188, 188, 189, 190, 190, 191, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 202, 203, 204, 204, 205, 206, 206, 207, 207, 208, 209, 209, 210, 210, 211, 212, 212 , 213, 213, 214, 215, 215, 216, 216, 217, 217, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 232, 233, 233, 234, 234, 235, 235, 235, 236, 236, 237, 237, 237, 238, 238, 239, 239, 239, 240, 240, 240, 241, 241 , 241, 242, 242, 242, 243, 243, 243, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 247, 247, 247, 247, 248, 248, 248, 248, 248, 249, 249, 249, 249, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253 , 253, 253, 253, 253, 253, 253, 253, 253, 253, 254, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 249, 249, 249, 249, 248, 248, 248, 248, 248, 247, 247 , 247, 247, 246, 246, 246, 245, 245, 245, 245, 244, 244, 244, 243, 243, 243, 242, 242, 242, 241, 241, 241, 240, 240, 240, 239, 239, 239, 238, 238, 237, 237, 237, 236, 236, 235, 235, 235, 234, 234, 233, 233, 232, 232, 232, 231, 231, 230, 230, 229, 229, 228, 228, 227, 227, 226, 226, 225, 225, 224, 224, 223 , 223, 222, 222, 221, 221, 220, 220, 219, 219, 218, 217, 217, 216, 216, 215, 215, 214, 213, 213, 212, 212, 211, 210, 210, 209, 209, 208, 207, 207, 206, 206, 205, 204, 204, 203, 202, 202, 201, 201, 200, 199, 199, 198, 197, 197, 196, 195, 195, 194, 193, 193, 192, 191, 190, 190, 189, 188, 188, 187, 186, 186 , 185, 184, 183, 183, 182, 181, 181, 180, 179, 178, 178, 177, 176, 175, 175, 174, 173, 173, 172, 171, 170, 170, 169, 168, 167, 167, 166, 165, 164, 163, 163, 162, 161, 160, 160, 159, 158, 157, 157, 156, 155, 154, 153, 153, 152, 151, 150, 150, 149, 148, 147, 146, 146, 145, 144, 143, 142, 142, 141, 140, 139 , 138, 138, 137, 136, 135, 134, 134, 133, 132, 131, 130, 130, 129, 128, 127, 127, 126, 125, 124, 123, 123, 122, 121, 120, 119, 119, 118, 117, 116, 115, 115, 114, 113, 112, 111, 111, 110, 109, 108, 107, 107, 106, 105, 104, 103, 103, 102, 101, 100, 100, 99, 98, 97, 96, 96, 95, 94, 93, 93, 92, 91 , 90, 90, 89, 88, 87, 86, 86, 85, 84, 83, 83, 82, 81, 80, 80, 79, 78, 78, 77, 76, 75, 75, 74, 73, 72, 72, 71, 70, 70, 69, 68, 67, 67, 66, 65, 65, 64, 63, 63, 62, 61, 60, 60, 59, 58, 58, 57, 56, 56, 55, 54, 54, 53, 52, 52, 51, 51, 50, 49, 49, 48 , 47, 47, 46, 46, 45, 44, 44, 43, 43, 42, 41, 41, 40, 40, 39, 38, 38, 37, 37, 36, 36, 35, 34, 34, 33, 33, 32, 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 21, 20, 20, 19, 19, 18, 18, 18, 17, 17, 16 , 16, 16, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3 , 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24 , 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 43, 43, 44, 44, 45, 46, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 58, 58, 59 , 60, 60, 61, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 72, 73, 74, 75, 75, 76, 77, 78, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 89, 90, 90, 91, 92, 93, 93, 94, 95, 96, 96, 97, 98, 99, 100, 100, 101, 102, 103, 103, 104 105, 106, 107, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 123, 124, 125, 126,};
int index1 = 0; //index att retreive värden fom array "sine"
int index2 = 0; //index att retreive värden fom array "sine"
booleska kanal = 0. //state 0 skickar till en kanal, 1 skickar till andra kanalen
void setup() {
för (byte jag = 0; jag < 8; i ++) {
pinMode (i, matas); //set digital stift 0-7 som resultat
}
pinMode(outputSelector,OUTPUT);
pinMode(CS,OUTPUT);
pinMode(WR,OUTPUT);
(CLI); //stop avbrott
ställa in timer1 avbrott på ~88.2kHz (2 * 44,1 kHz)
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0; //initialize värde till 0
Set jämför match registrera för 1hz steg
OCR1A = 180, / / = (16 * 10 ^ 6) / (88200 * 1) - 1 (måste vara < 65536)
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Ange CS10 bit för 1 prescaler
TCCR1B | = (1 << CS10);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
SEI (); //enable avbrott
lågt inställd CS pin
digitalWrite(CS,LOW);
}
ISR(TIMER1_COMPA_vect) {//timer1 avbrott ~88.2kHz att skicka ljuddata (faktiskt på 88.398 kHz)
PORTB | = B00000100; //digitalWrite (WR, hög); //hold utgångar - så nya DAC data få inte skickas förrän vi är redo
om (kanal) {
PORTD = pgm_read_byte_near (sinus + index1); //send sine till digital stift 0-7
PORTB & = B11111110; //digitalWrite (outputSelector, låg); //select DACA
index1 += 10; //increment index värdet, ökar värdet av 10 = ~ 440hz
om (index1 > = 1000) {//reset index om det når 1000
index1 = 0;
}
}
annat {
PORTD = pgm_read_byte_near (sinus + index2); //send sine till digital stift 0-7
PORTB | = B00000001; //digitalWrite (outputSelector, hög); //select DACB
index2 += 11; //increment index värde, öka med 11 = ~ 480hz
om (index2 > = 1000) {//reset index om det når 1000
index2 = 0;
}
}
PORTB & = B11111011; //digitalWrite (WR, låg); //enable utgång igen
kanalen ^ = 1; //toggle kanal
}
void loop() {
göra andra saker här
}