Adding FIR_taps for EU AM broadcasting 9K00A3E

This commit is contained in:
Brumi-2021 2022-11-14 00:32:29 +01:00
parent 400cccdcc1
commit 25dfa96257

View File

@ -245,12 +245,29 @@ constexpr fir_taps_real<32> taps_6k0_decim_2 {
11815, 10413, 7946, 4978, 2134, -83, -1411, -1857, 11815, 10413, 7946, 4978, 2134, -83, -1411, -1857,
-1640, -1080, -474, -21, 208, 247, 178, 95, -1640, -1080, -474, -21, 208, 247, 178, 95,
} }, } },
};
// IFIR prototype filter fs=48000 ; pass=4500 , stop=7800, decim=4, fout=12000
// For Europe AM commercial broadcasting stations in LF/MF/HF, Emissions Designator 9K00A3E Bandwidth: 9.00 kHz (derivated from taps_6k0_decim_2 ):
// Pre-decimate LPF FIR filter design Created by SciPy Python with the "window method", num_taps = 32, cut_off = 4950. sample_rate = 48000 # Hz,
// Created with h = signal.firwin(num_taps, cut_off, nyq=sample_rate/2, window=('chebwin',49)) , achieving good STOP band plot < -60 dB's with some ripple.
// post-escaled h taps to avoid decimals , targetting <= similar int values as previous taps_6k0_dsb_channel peak < 32.767 (2 exp 15) and similar H(f)gain
constexpr fir_taps_real<32> taps_9k0_decim_2 {
.low_frequency_normalized = -4500.0f / 48000.0f, // Negative -cutt off freq -3dB (real achieved data ,in the plot and measurements)
.high_frequency_normalized = 4500.0f / 48000.0f, // Positive +cutt off freq -3dB (idem)
.transition_normalized = 3300.0f / 48000.0f, // 3300 Hz = (7800 Hz - 4500 Hz) (both from plot H(f) curve plot)
.taps = { {
-40, 3, 98, 239, 340, 266, -96, -726,
-1391, -1659, -1041, 772, 3691, 7156, 10271, 12118,
12118, 10271, 7156, 3691, 772, -1041, -1659, -1391,
-726, -96, 266, 340, 239, 98, 3, -40
} },
}; };
// Channel filter: fs=12000, pass=3000, stop=3300, decim=1, fout=12000 // Channel filter: fs=12000, pass=3000, stop=3300, decim=1, fout=12000
/* NOTE: Slightly less than 1.0 gain (normalized to 65536) due to max(taps) being /* NOTE: Slightly less than 1.0 gain (normalized to 65536) due to max(taps) being
* slightly larger than 32767 (33312). * slightly larger than 32767 (33312).
*/ */
constexpr fir_taps_complex<64> taps_6k0_dsb_channel { constexpr fir_taps_complex<64> taps_6k0_dsb_channel {
.low_frequency_normalized = -3000.0f / 12000.0f, .low_frequency_normalized = -3000.0f / 12000.0f,
.high_frequency_normalized = 3000.0f / 12000.0f, .high_frequency_normalized = 3000.0f / 12000.0f,
@ -275,6 +292,36 @@ constexpr fir_taps_complex<64> taps_6k0_dsb_channel {
} }, } },
}; };
// Channel filter: fs=12000, pass=4450, stop=4800, decim=1, fout=12000 (4k45 selected = aprox 4k5, after several iterative plot H(f) test, best trade off curve)
// For Europe AM commercial broadcasting stations in LF/MF/HF, Emissions Designator 9K00A3E Bandwidth: 9.00 kHz (derivative from taps_6k0_dsb_channel)
// FIR filter design created by SciPy Python with the "window method"; num_taps = 64, cut_off = 4450. sample_rate = 12000 # Hz,
// Created with : h=signal.firwin(num_taps, cut_off, nyq=sample_rate/2, window=('chebwin',50)), achieving good STOP band plot < -60 dB's with some ripple.
// post-escaled h taps to avoid decimals , targetting <= similar int values as previous taps_6k0_dsb_channel peak < 32.767 (2 exp 15), (29253) and similar H(f)gain
constexpr fir_taps_complex<64> taps_9k0_dsb_channel {
.low_frequency_normalized = -4500.0f / 12000.0f, // Negative -cutt off freq -3dB (in the H(f) curve plot)
.high_frequency_normalized = 4500.0f / 12000.0f, // Positive +cutt off freq -3dB (in the H(f) curve plot)
.transition_normalized = 350.0f / 12000.0f, // 350Hz = (4800 Hz -4450 Hz) cut-3dB's (both data comes from H(f) curve plot and confirmed by measurements )
.taps = { {
{ -34, 0 }, { 23, 0 }, { -13, 0 }, { -19, 0 },
{ 55, 0 }, { -65, 0 }, { 25, 0 }, { 59, 0 },
{ -137, 0 }, { 141, 0 }, { -35, 0 }, { -146, 0 },
{ 287, 0 }, { -262, 0 }, { 26, 0 }, { 317, 0 },
{ -544, 0 }, { 441, 0 }, { 29, 0 }, { -638, 0 },
{ 980, 0 }, { -707, 0 }, { -191, 0 }, { 1272, 0 },
{ -1805, 0 }, { 1175, 0 }, { 660, 0 }, { -2934, 0 },
{ 4214, 0 }, { -2774, 0 }, { -3655, 0 }, { 29253, 0 },
{ 29253, 0 }, { -3655, 0 }, { -2774, 0 }, { 4214, 0 },
{ -2934, 0 }, { 660, 0 }, { 1175, 0 }, { -1805, 0 },
{ 1272, 0 }, { -191, 0 }, { -707, 0 }, { 980, 0 },
{ -638, 0 }, { 29, 0 }, { 441, 0 }, { -544, 0 },
{ 317, 0 }, { 26, 0 }, { -262, 0 }, { 287, 0 },
{ -146, 0 }, { -35, 0 }, { 141, 0 }, { -137, 0 },
{ 59, 0 }, { 25, 0 }, { -65, 0 }, { 55, 0 },
{ -19, 0 }, { -13, 0 }, { 23, 0 }, { -34, 0 },
} },
};
// USB AM 2K80J3E emission type /////////////////////////////////////////// // USB AM 2K80J3E emission type ///////////////////////////////////////////
// IFIR prototype filter: fs=12000, pass=3000, stop=3300, decim=1, fout=12000 // IFIR prototype filter: fs=12000, pass=3000, stop=3300, decim=1, fout=12000