parent
32286b0023
commit
41f9003a7a
@ -1,118 +0,0 @@ |
|||||||
# 15/50us EIAJ de-emphasis filter for CD/DAT |
|
||||||
# |
|
||||||
# 09/02/98 (c) Heiko Eissfeldt |
|
||||||
# |
|
||||||
# 18/03/07 robs@users.sourceforge.net: changed to biquad for slightly |
|
||||||
# better accuracy. |
|
||||||
# |
|
||||||
# License: LGPL (Lesser Gnu Public License) |
|
||||||
# |
|
||||||
# This implements the inverse filter of the optional pre-emphasis stage |
|
||||||
# as defined by IEC 60908 (describing the audio cd format). |
|
||||||
# |
|
||||||
# Background: In the early days of audio cds, there were recording |
|
||||||
# problems with noise (for example in classical recordings). The high |
|
||||||
# dynamics of audio cds exposed these recording errors a lot. |
|
||||||
# |
|
||||||
# The commonly used solution at that time was to 'pre-emphasize' the |
|
||||||
# trebles to have a better signal-noise-ratio. That is trebles were |
|
||||||
# amplified before recording, so that they would give a stronger signal |
|
||||||
# compared to the underlying (tape) noise. |
|
||||||
# |
|
||||||
# For that purpose the audio signal was prefiltered with the following |
|
||||||
# frequency response (simple first order filter): |
|
||||||
# |
|
||||||
# V (in dB) |
|
||||||
# ^ |
|
||||||
# | |
|
||||||
# |~10dB _________________ |
|
||||||
# | / |
|
||||||
# | / | |
|
||||||
# | 20dB / decade ->/ | |
|
||||||
# | / | |
|
||||||
# |____________________/_ _ |_ _ _ _ _ _ _ _ _ Frequency |
|
||||||
# |0 dB | | |
|
||||||
# | | | |
|
||||||
# | | | |
|
||||||
# 3.1kHz ~10kHz |
|
||||||
# |
|
||||||
# So the recorded audio signal has amplified trebles compared to the |
|
||||||
# original. HiFi cd players do correct this by applying an inverse |
|
||||||
# filter automatically, the cd-rom drives or cd burners used by digital |
|
||||||
# sampling programs (like cdda2wav) however do not. |
|
||||||
# |
|
||||||
# So, this is what this effect does. |
|
||||||
# |
|
||||||
# This is the gnuplot file for the frequency response of the deemphasis. |
|
||||||
# |
|
||||||
# The absolute error is <=0.04dB up to ~12kHz, and <=0.06dB up to 20kHz. |
|
||||||
|
|
||||||
# First define the ideal filter: |
|
||||||
|
|
||||||
# Filter parameters |
|
||||||
T = 1. / 441000. # we use the tenfold sampling frequency |
|
||||||
OmegaU = 1. / 15e-6 |
|
||||||
OmegaL = 15. / 50. * OmegaU |
|
||||||
|
|
||||||
# Calculate filter coefficients |
|
||||||
V0 = OmegaL / OmegaU |
|
||||||
H0 = V0 - 1. |
|
||||||
B = V0 * tan(OmegaU * T / 2.) |
|
||||||
A1 = (B - 1.) / (B + 1.) |
|
||||||
B0 = (1. + (1. - A1) * H0 / 2.) |
|
||||||
B1 = (A1 + (A1 - 1.) * H0 / 2.) |
|
||||||
|
|
||||||
# helper variables |
|
||||||
D = B1 / B0 |
|
||||||
O = 2 * pi * T |
|
||||||
|
|
||||||
# Ideal transfer function |
|
||||||
Hi(f) = B0*sqrt((1 + 2*cos(f*O)*D + D*D)/(1 + 2*cos(f*O)*A1 + A1*A1)) |
|
||||||
|
|
||||||
# Now use a biquad (RBJ high shelf) with sampling frequency of 44100Hz |
|
||||||
# to approximate the ideal curve: |
|
||||||
|
|
||||||
# Filter parameters |
|
||||||
t = 1. / 44100. |
|
||||||
gain = -9.477 |
|
||||||
slope = .4845 |
|
||||||
f0 = 5283 |
|
||||||
|
|
||||||
# Calculate filter coefficients |
|
||||||
A = exp(gain / 40. * log(10.)) |
|
||||||
w0 = 2. * pi * f0 * t |
|
||||||
alpha = sin(w0) / 2. * sqrt((A + 1. / A) * (1. / slope - 1.) + 2.) |
|
||||||
b0 = A * ((A + 1.) + (A - 1.) * cos(w0) + 2. * sqrt(A) * alpha) |
|
||||||
b1 = -2. * A * ((A - 1.) + (A + 1.) * cos(w0)) |
|
||||||
b2 = A * ((A + 1.) + (A - 1.) * cos(w0) - 2. * sqrt(A) * alpha) |
|
||||||
a0 = (A + 1.) - (A - 1.) * cos(w0) + 2. * sqrt(A) * alpha |
|
||||||
a1 = 2. * ((A - 1.) - (A + 1.) * cos(w0)) |
|
||||||
a2 = (A + 1.) - (A - 1.) * cos(w0) - 2. * sqrt(A) * alpha |
|
||||||
b2 = b2 / a0 |
|
||||||
b1 = b1 / a0 |
|
||||||
b0 = b0 / a0 |
|
||||||
a2 = a2 / a0 |
|
||||||
a1 = a1 / a0 |
|
||||||
|
|
||||||
# helper variables |
|
||||||
o = 2 * pi * t |
|
||||||
|
|
||||||
# Best fit transfer function |
|
||||||
Hb(f) = sqrt((b0*b0 + b1*b1 + b2*b2 +\ |
|
||||||
2.*(b0*b1 + b1*b2)*cos(f*o) + 2.*(b0*b2)* cos(2.*f*o)) /\ |
|
||||||
(1. + a1*a1 + a2*a2 + 2.*(a1 + a1*a2)*cos(f*o) + 2.*a2*cos(2.*f*o))) |
|
||||||
|
|
||||||
# plot real, best, ideal, level with halved attenuation, |
|
||||||
# level at full attentuation, 10fold magnified error |
|
||||||
set logscale x |
|
||||||
set grid xtics ytics mxtics mytics |
|
||||||
set key left bottom |
|
||||||
plot [f=1000:20000] [-12:2] \ |
|
||||||
20 * log10(Hi(f)),\ |
|
||||||
20 * log10(Hb(f)),\ |
|
||||||
20 * log10(OmegaL/(2 * pi * f)),\ |
|
||||||
.5 * 20 * log10(V0),\ |
|
||||||
20 * log10(V0),\ |
|
||||||
200 * log10(Hb(f)/Hi(f)) |
|
||||||
|
|
||||||
pause -1 "Hit return to continue" |
|
Loading…
Reference in new issue