2011-09-30 8 views
5

Attualmente sto lavorando a un progetto che è stato relativamente facile, fino ad ora. Il progetto di base è quello di trasmettere dati/messaggi su laser utilizzando la trasformazione audio. In poche parole il processo è attualmente similiTrasferimento audio Python tramite laser

  1. L'utente immette un messaggio
  2. messaggio viene trasformata in binario
  3. Per ogni 1 e 0 nel messaggio binario, emette un segnale corrispondente al segnale che è che, nel mio caso 250hz per 1 e 450 hz per uno 0.
  4. Il tono in uscita viene inviato tramite un cavo stereo a un trasformatore audio su un laser
  5. Un pannello solare funge da microfono e registra il "suono" in entrata come file
  6. Riproduce il file indietro e legge i toni e cerca di far corrispondere 250 e 450 Hz a 1 o 0 (che è il mio problema).

Fino a quando l'elaborazione effettiva del suono va bene, il mio problema attuale è il seguente.

Riproduco i toni ciascuno per x volta, sul lato ricevente viene registrato per y, l'ora viene tagliata campionata molte volte e quindi analizzato campione per campione che quindi registra ogni frequenza. Questo è inefficiente e inaccurato. Ho avuto molti problemi a prescindere dal momento in cui suono i toni perché spesso sente un tono due volte o non lo sente affatto, il che cancella completamente interi messaggi.
Ho provato a far corrispondere la frequenza con cui si campiona nel momento in cui suona ciascun tono, ma a meno che non sia allineato di conseguenza, non funziona. Ho avuto solo alcuni test di successo per messaggi come "test" e "ciao". Ho già guardato in bpsk e fsk, ma mi sento come se stessi già facendo qualcosa di simile ma che ho una brutta fine per decifrare tutto.

Questo è tutto scritto in Python e sarei molto grato per eventuali suggerimenti, suggerimenti o possibili implementazioni che è possibile fornire. Anche per emissione di toni sto usando pyaudiere e per la registrazione sto usando pyaudio.

Grazie!

-Steve

+3

Buona domanda: è più legata alla DSP che alla programmazione, quindi è possibile provare http://DSP.stackexchange.com –

+0

Per quanto tempo vengono utilizzati per il rilevamento ciascun tono e il metodo utilizzato? –

+0

possibile duplicato di [Binary Phase Shift Keying in Python] (http://stackoverflow.com/questions/7466715/binary-phase-shift-keying-in-python) –

risposta

2

Sembra un problema hardware. Sono abbastanza sicuro che è un lavoro per FSK. La maggior parte dei moderni sistemi di tipo FSK utilizza PLL (Phase-Locking Loop chip) per il rilevamento effettivo. Sono anche utilizzabili i circuiti da frequenza a tensione o da frequenza a corrente.

Ho visto circuiti pratici in dozzine di libri hobbisti e in schede tecniche e siti web.Ecco alcuni:

Circuit for demodulating an FSK signal

PLL Tutorial

Spero che questo non è solo un altro viaggio nella tana del coniglio per voi - buona fortuna!

0

Utilizzare una rappresentazione del segnale di auto-clocking, come Manchester code. In questo modo il tuo tempismo deve essere solo "abbastanza buono" e ti preoccupi principalmente di rilevare il cambiamento, in questo caso, della frequenza. Nell'articolo collegato i livelli alto e basso si riferiscono alla tensione, ma non c'è motivo per cui debbano farlo. Puoi altrettanto facilmente utilizzare una frequenza alta e bassa o accendere/spegnere un singolo laser.

+0

Il codice di Manchester è un buon suggerimento, ma c'è ancora il problema del rilevamento del tono effettivo. –

+0

Si potrebbe lanciare una rete neurale al problema, alimentarla con una finestra scorrevole di campioni e chiedere ad ogni ciclo di clock quale sia la natura del segnale in quel momento. Dovrai prendere queste decisioni manualmente sui dati di allenamento. – wberry

1

È stato eseguito un controllo di integrità ascoltando i file audio (sia in trasmissione che in ricezione) o visualizzando le forme d'onda con un editor audio per verificare se suonano o sembrano uguali? In questo modo puoi restringere il problema per canalizzare gli errori indotti contro l'analisi del tuo software.

Il software di decodifica/demodulazione richiede un metodo di sincronizzazione in grado di determinare e tenere traccia dei tempi di variazione del segnale audio da una frequenza di modulazione a un'altra, quindi è necessario testare separatamente questo metodo di sincronizzazione per gli errori di offset.

1

Vorrei affrontare l'estremità ricevente utilizzando due filtri FIR, uno per ciascuna frequenza che si sta tentando di rilevare. I coefficienti dei filtri sono solo una copia del segnale che stai cercando (vale a dire 250Hz in un caso e 450Hz nell'altro). Dovresti esaminare l'output del tuo pannello solare per decidere se si tratta di un'onda quadra, un'onda sinusoidale o qualcosa in mezzo. La lunghezza del filtro corrisponde alla durata del tono (cioè 'x' nella tua domanda). I campioni vengono inseriti in entrambi i filtri in parallelo.

L'uscita di ciascun filtro deve essere rettificata (vale a dire prendere il valore assoluto) e levigata. Il livellamento può essere eseguito utilizzando una media mobile semplice per un periodo di circa metà x (è possibile sperimentare per trovare il valore migliore). Quindi, se confronti i valori smussati (cioè a> b, o b> a) dovresti ottenere un flusso di 0 e di 1.

Cose da prendere in considerazione: ciò presuppone che il canale si comporti allo stesso modo per entrambe le frequenze (cioè si ottengono snr e attenuazione simili). Potrebbe essere necessario modificare leggermente le frequenze perché 450Hz è abbastanza vicino a 500Hz che è un'armonica di 250Hz.