2013-04-13 18 views
7

Sto lavorando a un progetto personale. Voglio trasmettere alcuni dati via etere con un vecchio radioamatore.alternativa più veloce a Beep di windows.h()

Il mio primo progetto applicazione funziona così:

costruisco un byte con 4 "segnali":

  • 5000Hz significa "00"

  • 6kHz significa "01"

  • 7khz significa "10"

  • 8kHz significa "11"

  • 9kHz significa uguale alla precedente

poi mi fondo quei 4 paio di pezzi insieme e ricominciare con quello successivo.

La demodulazione funziona alla grande e dovrebbe essere abbastanza veloce, ma sto avendo un problema con la generazione del suono ... è lento ...

Ecco il mio codice di debug:

#include <iostream> 
#include <windows.h> 

using namespace std; 

int main() 
{ 
Beep(5000, 100); 
Beep(6000, 100); 
Beep(7000, 100); 
Beep(8000, 100); 
Beep(9000, 100); 
return 0; 
} 

I 'm in attesa di 5 segnali acustici, vicini tra loro, 100 ms ciascuno, ma qui è ciò che ottengo (in alto, cinque "100ms bip(), e sul fondo, cinque '20ms bip()': a

Come si può vedere , quello che ottengo è un segnale acustico di 50ms seguito da una pausa di 75 ms quando voglio Segnali acustici di 100 ms e segnali acustici di 10 ms seguiti da una pausa di 100 ms quando desidero un segnale acustico di 20 ms.

C'è qualcosa di più veloce e più preciso di Beep() per Windows? (Qualcosa che funziona anche con linux sarebbe ancora meglio perché l'applicazione finale dovrebbe funzionare su un raspberry pi)

Avrei la maggiore larghezza di banda utilizzabile con suoni 3ms (.... 41 byte/sec ... ., che è più che sufficiente per la mia applicazione)

Compiler: g ++ (mingw)

Os: sette 64bits

+2

'Beep()' è sicuramente lo strumento sbagliato per questo lavoro. Non è progettato per essere preciso con qualsiasi mezzo.Dovresti generare i dati della forma d'onda e scriverli su una scheda audio (o equivalente), che è intrinsecamente specifica della piattaforma. Un'altra opzione è l'utilizzo di un microcontrollore che modula il segnale e lo collega al computer (il che renderebbe il trasferimento del codice un po 'più semplice). –

+2

È necessario selezionare un singolo sistema operativo. È improbabile che la soluzione per Windows sia la stessa sul pi. –

+0

@In silico, l'utilizzo di un microcontrollore sarà un'ultima soluzione di ressort (sono abbastanza confortevole con i μC di atmel e ho gli strumenti necessari per incidere la mia PCB ma preferirei andare senza l'hardware aggiuntivo) – srsbsns

risposta

2

Un modo (il che sarebbe adatto dal momento che si desidera raggiungere anche Linux) sarebbe quello di generare un file WAV, quindi riprodurlo. (Esistono modi semplici per i file WAV play su Windows e Linux.)

È possibile utilizzare una libreria per generare il file WAV o crearlo manualmente. Entrambi gli approcci sono piuttosto semplici. Ci sono molti examples sul web.

Se lo fai da te:

/* WAV header, 44 bytes */ 
struct wav_header { 
    uint32_t riff packed; 
    uint32_t len packed; 
    uint32_t wave packed; 
    uint32_t fmt packed; 
    uint32_t flen packed; 
    uint16_t one packed; 
    uint16_t chan packed; 
    uint32_t hz packed; 
    uint32_t bpsec packed; 
    uint16_t bpsmp packed; 
    uint16_t bitpsmp packed; 
    uint32_t dat packed; 
    uint32_t dlen packed; 
}; 

inizializzazione con:

void wav_header(wav_header *p, uint32_t dlen) 
{ 
    memcpy(p->riff, "RIFF", 4); 
    p->len = dlen + 44; 
    memcpy(p->wave, "WAVE", 4); 
    memcpy(p->fmt, "fmt ", 4); 
    p->flen = 0x10; 
    p->one = 1; 
    p->chan = 1; 
    p->hz = 22050; 
    p->bpsec = hz; 
    p->bpsmp = 1; 
    p->bitpsmp = 8; 
    memcpy(p->dat, "data", 4); 
    p->dlen = dlen; 
} 
+0

L'ho provato prima (con uno script perl difficile) ma aveva lo stesso tipo di pause tra i suoni e qualche tipo di lag prima che il suono fosse effettivamente iniziato (suoni molto brevi (pochi ms) mai iniziati ...). Cercherò una soluzione C++ per fare questo, grazie. – srsbsns

+1

@srsbsns, puoi generare un gruppo di impulsi in anticipo? Quindi non ci dovrebbero essere pause. Se provi a generare solo 5 file WAV e li suoni, allora hai bisogno di una riproduzione a bassa latenza e di missive API. Cioè Suggerisco di non riprodurre un mucchio di file WAV, ma di generare un file WAV con l'intero messaggio. –

+0

buona idea, ci proverò, grazie! – srsbsns