2016-04-23 32 views
6

Ho scritto un programma in C++ per generare un file wav per un'onda sinusoidale a 800 Hz (1 canale, campionamento a 8000 bit, 16000 Hz, 32000 campioni per 2 secondi), ma quando suono o esamino il suo spettrogramma in Audacity, ha sfumature.Scrittura di file sinusoidale PCM a 8 bit produce sovratoni

Penso che il problema sia con l'algoritmo che converte l'onda sinusoidale in PCM; Io non sono sicuro dove mettere lo spostamento 'zero', a 127 o 127,5 o 128 ecc

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

e il file prodotto è questo: output.wav

Se necessario, ecco il file cpp: wavwriter.cpp

Grazie!

EDIT 2: ho cambiato il carattere a un 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; 

per evitare un comportamento indefinito. Lo stesso problema si applica ancora.

+0

È 'char' firmato o non firmato sulla tua piattaforma? –

+0

Cosa intendi? Sto usando Windows e C++. –

+0

Quanto pensi '(char) (127 + 60)' è? – Drop

risposta

3

È stato aggiunto il rumore di arrotondamento e il rumore di quantizzazione deterministico. L'onda sinusoidale si ripete in un numero intero esatto di campioni; quindi l'errore di arrotondamento (o la differenza tra il valore float e il valore UInt_8 della vostra onda sinusoidale) si ripete esattamente periodicamente, producendo armoniche udibili.

È possibile ridurre questo disturbo utilizzando il dithering e l'arrotondamento del rumore durante la conversione della sinusoide a virgola mobile in valori UInt_8.

Il dithering (o l'aggiunta di valori casuali frazionari a ogni campione prima dell'arrotondamento) rimuove il rumore deterministico. Il rumore risultante sarà più bianco invece che fatto di sfumature.

Il filtro del rumore non butta semplicemente via la parte frazionaria dall'arrotondamento, ma integra questo resto frazionario con un filtro IIR per spostare il rumore di quantizzazione su dove potrebbe essere meno udibile e con meno probabilità di creare un offset CC.

+0

Grazie, questo è utile –