db_factor3db = 1.4125; // 3dB = 10^(3/20) db_factor6db = 1.9952; // 6dB = 10^(6/20) db_factor9db = 2.8184; // 9dB = 10^(9/20) db_factor12db = 3.9811; // 12dB = 10^(12/20) new_wave = (short*)malloc(n_wave*sizeof(short)); for(i=0; i < n_wave; i++) { float temp = wave[i] * db_factor3db; if (temp > 32767) { wave[i] = 32767; } else if (temp < -32768) { wave[i] = -32768; } else { wave[i] = (short)temp; } }
Abbildung: Bei einer Verstärkung um 6 dB ist die Verzerrung wahrnehmbar. Ab 3dB tritt Clipping auf.
Abbildung: Verstärkung von Sinus 1kHz mit 0dB
Abbildung: Verstärkung von Sinus 1kHz mit 6dB
Abbildung: Verstärkung von Sinus 1kHz mit 9dB
Abbildung: Verstärkung von Sinus 1kHz mit 12dB
Frequenz (Hz) | Lautstärke (dB) | Oberwelle (dB) | Prozent (%) |
---|---|---|---|
1000 | -3,5 | ||
3000 | -18 | -14,5 | ca. 19 |
5000 | -36 | -32.5 | ca. 2 |
7000 | -47 | -43,5 | ca. 1 |
Berechnung des Klirrfaktors (allgemein):
Klirrfaktor k = (Effektivwert_ohne_Grundton) / (Effektivwert_mit_Grundton)
Effektivwert = sqrt(Effektivwert_1F02 + Effektivwert_2F02 + Effektivwert_3F02 + ...)
Berechnung unseres Klirrfaktors:
Klirrfaktor k = sqrt ((0,18822 + 0,02322 + 0,00072)/ (12 + 0,18822 + 0,02322 + 0,00072)) = 0,1863
n = 0.01 * freq_in; // 10ms //n = 0.2 * freq_in; // 200ms a = 0.6; new_wave = malloc(n_wave * sizeof(short)); for (i = 0; i < n_wave; i++) { if (i >= n) { new_wave[i] = 0.5 * wave[i] + (short)((float)(wave[i - n]) *a); } else { new_wave[i] = wave[i]; } }
Das n steht für die Anzahl der Verzögerungsglieder und das a für den Faktor des Echos. Wir addieren auf das Original das Echo (16 Bit + 16 Bit = 32 Bit). Um eine Übersteuerung zu vermeiden multiplizieren wir mit 0.5.
for (i = 0; i < n_wave; i++) { //Tiefpass float temp = 0.5*wave[i] + 0.45*wave[i - 1]; //Hochpass //float temp =0.5*wave[i] - 0.45*wave[i-1]; wave[i] = (short)temp; }
Abbildung: Weisses Rauschen
Abbildung: Tiefpass
Abbildung: Hochpass