2016-04-23 12 views
6

Napisałem program w języku C++, aby wygenerować plik .wav dla fali sinusoidalnej 800Hz (1 kanał, 8-bitowy, próbkowanie 16000 Hz, 32000 próbek, więc 2 sekundy), ale kiedy go odtwarzam lub sprawdzam jego spektrogram w Audacity, ma on podtekst.Zapisywanie 8-bitowego pliku WAV fal sinusoidalnych PCM wytwarza podteksty

Myślę, że problem polega na tym, że algorytm przekształca falę sinusoidalną na PCM; Nie jestem pewien gdzie umieścić 'zero' przemieszczenie na 127 lub 127.5 lub 128 itd

char data[32000]; 
for (int j = 0; j < 32000; ++j) 
{ 
    data[j] = (char) (round(127 + 60 * (sin(2.0 * 3.14159265358979323846264338327950 * j/20.0)))); 
} 

a plik produkowany jest taka: output.wav

Jeśli to konieczne, oto plik cpp: wavwriter.cpp

Dzięki!

EDIT 2: Zmieniłem char do uint8_t

uint8_t data[32000]; 
for (int j = 0; j < 32000; ++j) 
{ 
    data[j] = round(127 + 60 * (sin(2.0 * 3.14159265358979323846264338327950 * j/20.0))); 


} 
outfile.write((char *)&data[0], sizeof data); 


outfile.close(); 
return true; 

uniknąć niezdefiniowane zachowanie. Ten sam problem nadal obowiązuje.

+0

Czy "char" jest podpisane lub niepodpisane na platformie? –

+0

Co masz na myśli? Używam Windows i C++. –

+0

Jak myślisz ile ('char) (127 + 60)' jest? – Drop

Odpowiedz

3

Dodano dźwięk zaokrąglania i deterministyczny szum kwantyzacji. Twoja sinusa powtarza się w dokładnej liczbie całkowitej próbek; w związku z tym błąd zaokrąglenia (lub różnica między wartością zmiennoprzecinkową a wartością UInt_8 sinusoidy) powtarza się dokładnie okresowo, co powoduje słyszalne harmoniczne.

Możesz zredukować ten szum poprzez zastosowanie ditheringu i filtrowania zaokrąglenia szumu podczas przekształcania sinusoidy zmiennoprzecinkowej w wartości UInt_8.

Roztrząsanie (lub dodanie ułamkowych wartości losowych do każdej próbki przed zaokrągleniem) usuwa deterministyczny szum. Powstały hałas będzie bielszy, zamiast wydobywać się z podtekstów.

Filtrowanie szumów nie tylko odrzuca część ułamkową z zaokrąglenia, ale integruje tę pozostałość ułamkową z filtrem IIR, aby przenieść szum kwantyzacji do miejsca, w którym może być mniej słyszalny i mniej prawdopodobne, aby utworzyć przesunięcie DC.

+0

Dzięki, to jest pomocne –