2013-04-13 13 views
7

Pracuję nad osobistym projektem. Chcę transmitować niektóre dane za pomocą starego radia krótkofalarskiego.szybsza alternatywa dla sygnału dźwiękowego Windows.h()

Mój pierwszy projekt aplikacja działa tak:

skonstruować jeden bajt z 4 "sygnały":

  • 5000 Hz oznacza "00"

  • 6kHz oznacza "01"

  • 7khz oznacza "10"

  • 8kHz oznacza „11”

  • 9kHz oznacza taki sam jak poprzedni

potem połączyć te 4 par bitów razem i ponownie rozpocząć następny.

demodulacji działa świetnie i powinny być wystarczająco szybki, ale mam problem z generowaniem dźwięku ... to powoli ...

Oto mój kod 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 spodziewając 5 sygnałów dźwiękowych, blisko siebie, 100ms każdy ale oto co mam (na górze, pięć„100ms dźwięki(), a na dole, pięć «20ms dźwięki()»: a

Jak widać , dostaję 50ms dźwięków po 75ms pauzy, kiedy chcę 100 ms dźwięków i 10 ms dźwięków, po których następuje 100 ms przerwy, gdy chcę wydać dźwięk o długości 20 ms.

Czy jest coś szybszego i dokładniejszego niż Beep() dla Windows? (coś, co działa z Linuksem, byłoby jeszcze lepsze, ponieważ ostatnia aplikacja powinna działać na raspberry pi).

Dostałbym większą użyteczną przepustowość z dźwiękami 3ms (.... 41 bajtów/sek ... ., który jest więcej niż wystarczająco dla mojej aplikacji)

Compiler: g ++ (MinGW)

Os: siedem 64Bits

+2

'Beep()' jest zdecydowanie źle narzędziem do tego zadania. W żaden sposób nie został zaprojektowany tak, by był precyzyjny.Będziesz musiał wygenerować dane przebiegu i zapisać je na karcie dźwiękowej (lub jej odpowiedniku), która jest z natury specyficzna dla platformy. Inną opcją jest użycie mikrokontrolera, który moduluje sygnał i dołącza go do komputera (co ułatwiłoby portowanie kodu). –

+2

Będziesz musiał wybrać jeden system operacyjny. Rozwiązanie, którego szukasz w systemie Windows, prawdopodobnie nie będzie takie samo na pi. –

+0

@In silico, użycie mikrokontrolera będzie ostatnim rozwiązaniem ressortu (jestem dość komfortowy dla mikrokontrolerów μC i mam niezbędne narzędzia do wytrawiania swoich własnych płyt pcb, ale wolałbym jechać bez dodatkowego sprzętu) – srsbsns

Odpowiedz

2

Jednym ze sposobów (który byłby odpowiedni, ponieważ chcesz kierować Linux zbyt) byłoby wygenerować plik WAV, a następnie go odtworzyć. (Istnieją proste sposoby na pliki WAV w systemach Windows i Linux.)

Możesz użyć biblioteki do wygenerowania pliku WAV lub utworzyć go samodzielnie, oba podejścia są dość proste. W sieci jest wiele examples.

Jeśli zrobisz to sam:

/* 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; 
}; 

Initialize z:

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

Najpierw próbowałem tego (z trudnym skryptem perla), ale miał on ten sam rodzaj przerw między dźwiękami a jakimś opóźnieniem, zanim dźwięk faktycznie się zaczął (bardzo krótkie (kilka ms) dźwięki nigdy się nie zaczęły ...). Będę szukał rozwiązania C++, aby to zrobić, dziękuję. – srsbsns

+1

@sbsbsns, czy możesz wcześniej wygenerować wiązkę impulsów? Wtedy nie powinno być żadnych pauz. Jeśli spróbujesz stworzyć tylko 5 plików WAV i zagrasz je, potrzebujesz funkcji odtwarzania z opóźnieniem i miksowania API. To znaczy. Sugeruję, aby nie odtwarzać wielu plików WAV, ale generować jeden plik WAV z całą wiadomością. –

+0

Dobry pomysł, mam zamiar spróbować, dzięki! – srsbsns

Powiązane problemy