Salve a tutti pian piano sto cercando di venire a capo al mio progetto (ormai è cosa personale! ).
devo leggere un segnale e fare la fft, ho studiato un pochetto a riguardo dato che non posso utilizzare le librerie già fatte, ma fare una lettura campionando il segnale, e inviandolo sulla seriale, per poi fare tutto via software sul pc.
in primis per non appesantire il lavoro dell'arduino e limitare lo scambio di dati. comunque non vi scrivo per questo, la cosa che mi fa rimanere un po' perplesso, che tra l'altro è molto banale, è che in affetti arduino nativamente non può gestire un segnale, perché in effetti lui non è in grado leggere un segnale con valori negativi, quindi facendo un campionamento ottengo solo i valori positivi dello spettro e ovviamente nulla dei negativi, quindi mi chiedo primo, come fanno a fare la fft e/o oscilloscopi solo con valori positivi ma sopratutto, come faccio a prendere in considerazione tali valori? sicuramente mi sfugge qualcosa, ma è per questo che chiedo il vostro aiuto!!
ps. non avrei problemi di risoluzione bassa dovendo leggere un picco-picco, perchè le tensione del segnale sono di circa 2v picco picco, ma ho acquistato anche un adc esterno a 16bit per avere poi una maggiore risoluzione!
una delle tante righe di codice che ho trovato che lavora sulla fft è questo, in particolare questa è la parte dove campiona un segnale e gli da addirittura un segno, cosa che non riesco a capire dato che arduino nn legge valori negati, tra l'altro provandolo e usando l'ingresso a0, non ricevo nessuna lettura plausibile, mi da praticamente tutti valori in fondo scala, nello specifico quando somma i due byte facendo un Serial.println(k) ricevo sempre circa 3900 (nn ricordo il valore preciso ma mia pare sia la scala finale dei 16bit), il codice è questo:
void setup() {
Serial.begin(115200); // use the serial port
TIMSK0 = 0; // turn off timer0 for lower jitter
ADCSRA = 0xe5; // set the adc to free running mode
ADMUX = 0x40; // use adc0
DIDR0 = 0x01; // turn off the digital input for adc0
}
void loop() {
while(1) { // reduces jitter
cli(); // UDRE interrupt slows this way down on arduino1.0
for (int i = 0 ; i < FHT_N ; i++) { // save 256 samples
while(!(ADCSRA & 0x10)); // wait for adc to be ready
ADCSRA = 0xf5; // restart adc
byte m = ADCL; // fetch adc data
byte j = ADCH;
int k = (j << 8) | m; // form into an int
k -= 0x0200; // form into a signed int
k <<= 6; // form into a 16b signed int
fht_input[i] = k; // put real data into bins
}
MisterZ:
perchè in effetti lui non leggere un segnale con valori negativi, quindi facendo un campionamento ottengo solo i valori positivi dello spettro e ovviamente nulla dei negativi, quindi mi chiedo primo, ...
Non sono elettronico, ma per quel che sò io la MCU non solo non legge i -V ma questi negativi possono danneggiare il pin. Datasheet del atmega 328pu, paragrafo "28.1 Absolute Maximum Ratings"
Voltage on any Pin except RESET with respect to Ground =-0.5V to VCC+0.5V
le fft cosa sono fatture?
E no, perchè se scrivete tutto prtt e mmm cococo il discorso invece di accorciarsi si allunga, eh! parliamo come magnamo su dai!
Perfetto scriviamolo, perchè il forum non è solo per ingegneri, ci sono anche altri che stanno imparando, non tutti processiamo segnali analogici appena svegli .... oggi mi faccio bannare
Bannare no ... ma consigliarti ogni tanto pure tu di usare Google SI !
FFT è un acronimo universamlemte riconosciuto ... NON troverai mai nessuno che in una discussione scrivere "... devo calcolare la trasformata di Fourier veloce" ... ma tutti usano FFT
Divertiti a cercare "Arduino FFT" e vedrai uscire ... 177'000 risultati
Certo che l'ho usato google, infatti sono arrivato alla pag 155 ... ma siccome io sono un elettronico digitale (dove c'è solo 0 e 1 ) e non ho mai fatto campionamenti di segnali analog, mi piaceva seguire l'argomento
Anche se un po' di operazionali li ho usati.
ora che bene o male abbiamo capito cos'è la FFt, mi spiegate come fanno a farla se arduino non legge segnali negativi?
ma in realtà potrebbe anche non interessarmi se poi l'algoritmo rispecchia veramente quello reale, o sono barrette un pò randomizzate XD
quello che vi chiedo e come posso fare per effettuare una lettura negativa, se mando lo stesso segnale su un altro ingresso utilizzando "qualcosa", e dovete dirmi voi cosa, che inverta il segno (come un not) e quindi faccia leggere ad arduino un segnale positivo dove poi io lo gestisco via software (sapendo per l'appunto che quel valore in realtà è negativo).
e poi altra cosa a questo punto come filtro gli ingressi in modo da nn far leggere mai letture negative sugli ingressi?
Brunello:
Oppure con l'ADC che hai , se ha degli ingressi differenziali
io ho preso questo adc "16 Bit I2C 4 Canali ADS1115", leggendo le caratteristiche utilizzandolo con ingressi differenziali, che si riducono poi a 2, a qual punto come faccio ad utilizzarlo? l'ho comprato ma stavo lavorando sul codice di base per implementarlo solo una volta terminato per incrementare la risoluzione, immagino che a questo punto per il mio caso sia la soluzione ideale cosi non sacrifico nemmeno la risoluzione, sapete inoltre dirmi se posso usare 2 canali single-ended + l'ultima coppia con ingresso differenziale?
MisterZ: cortesemente metti sempre il link hai prodotti ... le ricerche con Google spesso danno più schedine con lo stesso chip ... ed è meglio vedere quella che usi TU. Grazie.
Intanto studiati QUESTO tutorial di Adafruit ... vedrai che chiarisce già parecchi dubbi ...
Inoltre, nella sezione downloads, trovi anche la libreria pronta per Arduino.
Guglielmo
P.S.: Tranquillo, finché non metti link per pubblicizzare un TUOprodotto commerciale, va tutto bene e NON c'è alcun problema a mettere quelli di prodotti che si usano.