Go Down

Topic: Generatore di rumore bianco digitale con Arduino (Read 882 times) previous topic - next topic

xbill

Salve a tutti ragazzi!
Volevo chiedere un informazione:
- siccome sto ultimando un sintetizzatore modulare autocostruito, ho la necessità di avere una sorgente di white noise digitale;
so benissimo che è veramente semplice crearla in modo analogico (basta amplificare il rumore di collettore di un transistor generico) ma
mi serviva in maniera digitale e volevo sapere se con Arduino è possibile realizzare un progetto del genere.
La trasformazione in pink noise verrà poi delegata al classico filtraggio costituito da un op-amp.

grazie a tutti

leo72

Premetto che non me ne intendo di musica digitale, so che un generatore di rumore bianco è un generatore sonoro che riproduce un suono che non ha periodicità.
Potresti provare ad usare un timer agganciato ad un pin per generare un segnale PWM abbinato ad un generatore di numeri pseudo-casuali. Ad esempio potresti modificare il segnale PWM generato dal timer ogni volta che il contatore del timer va in overflow modificando il valore di partenza del contatore per il ciclo successivo o altri sistemi.

Per "inseminare" il generatore di numeri casuali dell'Arduino potresti usare la lettura di un pin analogico. Oppure potresti usare un'altra fonte esterna, ad esempio la lettura di una fotoresistenza.

cyclone

#2
Aug 17, 2012, 01:04 pm Last Edit: Aug 17, 2012, 01:12 pm by cyclone Reason: 1
quello che devi realizzare è un Linear Feedback Shift Register ( uno psedo - random number generator)
att. usa AVR-GCC o trasformalo x arduino ide

Code: [Select]

#include <avr/io.h>

uint8_t random(void){
    //32 bit random number, from noinit sram
    static uint32_t random31 __attribute__((section(".noinit")));
    //temp storage for random number
    uint32_t temp;
    temp = random31<<1;
    //if bit31 set, or if init sram happens to be 0
    if((temp & 0x80000000)||(temp == 0)){
        //xor magic number (taps)
        temp ^= 0x20AA95B5;
    }
    //save back to random number for next time
    random31 = temp;
    //return lowest byte only
    return temp;
}

int main(){
    while(1){
        PORTB=random();
    }
}


poi prendi l'uscita della portaB e la colleghi su un dac o su una rete resistiva... vedi

un altro modo sarebbe questo:
prendi i bit meno significativi dell' ADC (solo 8bit) , con l' ingresso collegato su una pista di qualche centimetro, fai un shift a destra 16 volte, poi sommaci il valore del TCNT e questo diventa il tuo LFSR number generator


Go Up