removed sample rates which cannot be used because the resulting block sizes would be invalid

This commit is contained in:
Volker Fischer 2009-07-08 12:46:15 +00:00
parent fa7617be21
commit ca509f4207
4 changed files with 93 additions and 131 deletions

View file

@ -56,7 +56,7 @@
#define LLCON_DEFAULT_PORT_NUMBER 22123 #define LLCON_DEFAULT_PORT_NUMBER 22123
// system sample rate // system sample rate
#define SYSTEM_SAMPLE_RATE 32000 #define SYSTEM_SAMPLE_RATE 33000
// sound card sample rate. Should be always 48 kHz to avoid sound card driver // sound card sample rate. Should be always 48 kHz to avoid sound card driver
// internal sample rate conversion which might be buggy // internal sample rate conversion which might be buggy

View file

@ -157,16 +157,10 @@ void CStereoAudioResample::Init ( const int iNewMonoInputBlockSize,
iI = DECIM_D_2; iI = DECIM_D_2;
break; break;
case ( SND_CRD_SAMPLE_RATE * 7 / 12 ): // 48 kHz to 28 kHz case ( SND_CRD_SAMPLE_RATE * 11 / 16 ): // 48 kHz to 33 kHz
pFiltTaps = fResTaps12_7; pFiltTaps = fResTaps16_11;
iNumTaps = INTERP_I_12_7 * NUM_TAPS_PER_PHASE12_7; iNumTaps = INTERP_I_16_11 * NUM_TAPS_PER_PHASE16_11;
iI = DECIM_D_12_7; iI = DECIM_D_16_11;
break;
case ( SND_CRD_SAMPLE_RATE * 2 / 3 ): // 48 kHz to 32 kHz
pFiltTaps = fResTaps3_2;
iNumTaps = INTERP_I_3_2 * NUM_TAPS_PER_PHASE3_2;
iI = DECIM_D_3_2;
break; break;
case SND_CRD_SAMPLE_RATE: // 48 kHz to 48 kHz case SND_CRD_SAMPLE_RATE: // 48 kHz to 48 kHz
@ -192,16 +186,10 @@ void CStereoAudioResample::Init ( const int iNewMonoInputBlockSize,
iI = INTERP_I_2; iI = INTERP_I_2;
break; break;
case ( SND_CRD_SAMPLE_RATE * 7 / 12 ): // 28 kHz to 48 kHz case ( SND_CRD_SAMPLE_RATE * 11 / 16 ): // 33 kHz to 48 kHz
pFiltTaps = fResTaps12_7; pFiltTaps = fResTaps16_11;
iNumTaps = DECIM_D_12_7 * NUM_TAPS_PER_PHASE12_7; iNumTaps = DECIM_D_16_11 * NUM_TAPS_PER_PHASE16_11;
iI = INTERP_I_12_7; iI = INTERP_I_16_11;
break;
case ( SND_CRD_SAMPLE_RATE * 2 / 3 ): // 32 kHz to 48 kHz
pFiltTaps = fResTaps3_2;
iNumTaps = DECIM_D_3_2 * NUM_TAPS_PER_PHASE3_2;
iI = INTERP_I_3_2;
break; break;
default: default:

View file

@ -6,15 +6,12 @@
#define _RESAMPLEFILTER_H_ #define _RESAMPLEFILTER_H_
#define NUM_TAPS_PER_PHASE2 4 #define NUM_TAPS_PER_PHASE2 4
#define NUM_TAPS_PER_PHASE3_2 4 #define NUM_TAPS_PER_PHASE16_11 4
#define NUM_TAPS_PER_PHASE12_7 4
#define NUM_TAPS_PER_PHASE1 4 #define NUM_TAPS_PER_PHASE1 4
#define INTERP_I_2 2 #define INTERP_I_2 2
#define DECIM_D_2 1 #define DECIM_D_2 1
#define INTERP_I_3_2 3 #define INTERP_I_16_11 16
#define DECIM_D_3_2 2 #define DECIM_D_16_11 11
#define INTERP_I_12_7 12
#define DECIM_D_12_7 7
#define INTERP_DECIM_I_D1 10 #define INTERP_DECIM_I_D1 10
@ -32,73 +29,72 @@ static float fResTaps2[INTERP_I_2 * DECIM_D_2 * NUM_TAPS_PER_PHASE2] = {
}; };
// Filter for ratio 3 / 2 // Filter for ratio 16 / 11
static float fResTaps3_2[INTERP_I_3_2 * DECIM_D_3_2 * NUM_TAPS_PER_PHASE3_2] = { static float fResTaps16_11[INTERP_I_16_11 * DECIM_D_16_11 * NUM_TAPS_PER_PHASE16_11] = {
-0.00236050848304511720f, -0.00041538398445601011f,
-0.01964925537472771800f, -0.00100091112500674300f,
-0.02322665824624670800f, -0.00188545235900149580f,
0.07695645894852715100f, -0.00309245271152946720f,
0.31008603640539528000f, -0.00461648637097546860f,
0.52643626441129154000f, -0.00641536079120213090f,
0.52643626441129154000f, -0.00840374276694629340f,
0.31008603640539528000f, -0.01044911278449296500f,
0.07695645894852715100f, -0.01237076454632044700f,
-0.02322665824624670800f, -0.01394240453358767100f,
-0.01964925537472771800f, -0.01489867899787415000f,
-0.00236050848304511720f -0.01494567649453993500f,
}; -0.01377514228383602500f,
-0.01108182026370746600f,
-0.00658303471198398540f,
// Filter for ratio 12 / 7 -0.00003936453391759546f,
static float fResTaps12_7[INTERP_I_12_7 * DECIM_D_12_7 * NUM_TAPS_PER_PHASE12_7] = { 0.00872492845809500280f,
-0.00053443628842632721f, 0.01980315802304051200f,
-0.00154456511654914500f, 0.03319059870725740000f,
-0.00318877973492145670f, 0.04877332727115071100f,
-0.00548415611879476010f, 0.06632263168859610400f,
-0.00831996900560136310f, 0.08549578434166034400f,
-0.01142644215457233100f, 0.10584358400577590000f,
-0.01435914512086756300f, 0.12682462834108582000f,
-0.01650486134503697700f, 0.14782581648829729000f,
-0.01711253513002239700f, 0.16818813437991034000f,
-0.01534980745584262400f, 0.18723637790984679000f,
-0.01038204348602874600f, 0.20431115275701389000f,
-0.00146712812293579720f, 0.21880128059464088000f,
0.01194379798880749800f, 0.23017465811007956000f,
0.03011155812550227500f, 0.23800566683418956000f,
0.05293264234056074100f, 0.24199741710446424000f,
0.07989289520785943000f, 0.24199741710446424000f,
0.11006001475908662000f, 0.23800566683418956000f,
0.14211961311732932000f, 0.23017465811007956000f,
0.17445458077244999000f, 0.21880128059464088000f,
0.20526218373129310000f, 0.20431115275701389000f,
0.23269841067097030000f, 0.18723637790984679000f,
0.25503525684230932000f, 0.16818813437991034000f,
0.27081444032816293000f, 0.14782581648829729000f,
0.27898084356141867000f, 0.12682462834108582000f,
0.27898084356141867000f, 0.10584358400577590000f,
0.27081444032816293000f, 0.08549578434166034400f,
0.25503525684230932000f, 0.06632263168859610400f,
0.23269841067097030000f, 0.04877332727115071100f,
0.20526218373129310000f, 0.03319059870725740000f,
0.17445458077244999000f, 0.01980315802304051200f,
0.14211961311732932000f, 0.00872492845809500280f,
0.11006001475908662000f, -0.00003936453391759546f,
0.07989289520785943000f, -0.00658303471198398540f,
0.05293264234056074100f, -0.01108182026370746600f,
0.03011155812550227500f, -0.01377514228383602500f,
0.01194379798880749800f, -0.01494567649453993500f,
-0.00146712812293579720f, -0.01489867899787415000f,
-0.01038204348602874600f, -0.01394240453358767100f,
-0.01534980745584262400f, -0.01237076454632044700f,
-0.01711253513002239700f, -0.01044911278449296500f,
-0.01650486134503697700f, -0.00840374276694629340f,
-0.01435914512086756300f, -0.00641536079120213090f,
-0.01142644215457233100f, -0.00461648637097546860f,
-0.00831996900560136310f, -0.00309245271152946720f,
-0.00548415611879476010f, -0.00188545235900149580f,
-0.00318877973492145670f, -0.00100091112500674300f,
-0.00154456511654914500f, -0.00041538398445601011f
-0.00053443628842632721f
}; };
// Filter for ratios close to 1 // Filter for ratios close to 1

View file

@ -11,10 +11,9 @@ function resamplefilter()
% Number of taps per poly phase for different resampling types % Number of taps per poly phase for different resampling types
GlobalNoTaps = 4; % use global value for all types GlobalNoTaps = 4; % use global value for all types
NoTapsP2 = GlobalNoTaps; % 24 kHz NoTapsP2 = GlobalNoTaps; % 24 kHz
NoTapsP3_2 = GlobalNoTaps; % 32 kHz NoTapsP16_11 = GlobalNoTaps; % 33 kHz
NoTapsP12_7 = GlobalNoTaps; % 28 kHz NoTapsP1 = GlobalNoTaps; % 48 kHz
NoTapsP1 = GlobalNoTaps; % 48 kHz
% Filter for ratio 2 ----------------------------------------------------------- % Filter for ratio 2 -----------------------------------------------------------
@ -26,22 +25,13 @@ D2 = 1;
h2 = DesignFilter(NoTapsP2, I2); h2 = DesignFilter(NoTapsP2, I2);
% Filter for ratio 3 / 2 ------------------------------------------------------- % Filter for ratio 16 / 11 -----------------------------------------------------
% I and D % I and D
I3_2 = 3; I16_11 = 16;
D3_2 = 2; D16_11 = 11;
% filter design % filter design
h3_2 = DesignFilter(NoTapsP3_2, I3_2); h16_11 = DesignFilter(NoTapsP16_11, I16_11);
% Filter for ratio 12 / 7 ------------------------------------------------------
% I and D
I12_7 = 12;
D12_7 = 7;
% filter design
h12_7 = DesignFilter(NoTapsP12_7, I12_7);
% Filter for ratios close to 1 ------------------------------------------------- % Filter for ratios close to 1 -------------------------------------------------
@ -65,11 +55,8 @@ fprintf(fid, '#define _RESAMPLEFILTER_H_\n\n');
fprintf(fid, '#define NUM_TAPS_PER_PHASE2 '); fprintf(fid, '#define NUM_TAPS_PER_PHASE2 ');
fprintf(fid, int2str(NoTapsP2)); fprintf(fid, int2str(NoTapsP2));
fprintf(fid, '\n'); fprintf(fid, '\n');
fprintf(fid, '#define NUM_TAPS_PER_PHASE3_2 '); fprintf(fid, '#define NUM_TAPS_PER_PHASE16_11 ');
fprintf(fid, int2str(NoTapsP3_2)); fprintf(fid, int2str(NoTapsP16_11));
fprintf(fid, '\n');
fprintf(fid, '#define NUM_TAPS_PER_PHASE12_7 ');
fprintf(fid, int2str(NoTapsP12_7));
fprintf(fid, '\n'); fprintf(fid, '\n');
fprintf(fid, '#define NUM_TAPS_PER_PHASE1 '); fprintf(fid, '#define NUM_TAPS_PER_PHASE1 ');
fprintf(fid, int2str(NoTapsP1)); fprintf(fid, int2str(NoTapsP1));
@ -80,17 +67,11 @@ fprintf(fid, '\n');
fprintf(fid, '#define DECIM_D_2 '); fprintf(fid, '#define DECIM_D_2 ');
fprintf(fid, int2str(D2)); fprintf(fid, int2str(D2));
fprintf(fid, '\n'); fprintf(fid, '\n');
fprintf(fid, '#define INTERP_I_3_2 '); fprintf(fid, '#define INTERP_I_16_11 ');
fprintf(fid, int2str(I3_2)); fprintf(fid, int2str(I16_11));
fprintf(fid, '\n'); fprintf(fid, '\n');
fprintf(fid, '#define DECIM_D_3_2 '); fprintf(fid, '#define DECIM_D_16_11 ');
fprintf(fid, int2str(D3_2)); fprintf(fid, int2str(D16_11));
fprintf(fid, '\n');
fprintf(fid, '#define INTERP_I_12_7 ');
fprintf(fid, int2str(I12_7));
fprintf(fid, '\n');
fprintf(fid, '#define DECIM_D_12_7 ');
fprintf(fid, int2str(D12_7));
fprintf(fid, '\n'); fprintf(fid, '\n');
fprintf(fid, '#define INTERP_DECIM_I_D1 '); fprintf(fid, '#define INTERP_DECIM_I_D1 ');
fprintf(fid, int2str(I1)); fprintf(fid, int2str(I1));
@ -101,11 +82,8 @@ fprintf(fid, '\n\n');
fprintf(fid, '\n// Filter for ratio 2\n'); fprintf(fid, '\n// Filter for ratio 2\n');
ExportFilterTaps(fid, 'fResTaps2[INTERP_I_2 * DECIM_D_2 * NUM_TAPS_PER_PHASE2]', h2); ExportFilterTaps(fid, 'fResTaps2[INTERP_I_2 * DECIM_D_2 * NUM_TAPS_PER_PHASE2]', h2);
fprintf(fid, '\n// Filter for ratio 3 / 2\n'); fprintf(fid, '\n// Filter for ratio 16 / 11\n');
ExportFilterTaps(fid, 'fResTaps3_2[INTERP_I_3_2 * DECIM_D_3_2 * NUM_TAPS_PER_PHASE3_2]', h3_2); ExportFilterTaps(fid, 'fResTaps16_11[INTERP_I_16_11 * DECIM_D_16_11 * NUM_TAPS_PER_PHASE16_11]', h16_11);
fprintf(fid, '\n// Filter for ratio 12 / 7\n');
ExportFilterTaps(fid, 'fResTaps12_7[INTERP_I_12_7 * DECIM_D_12_7 * NUM_TAPS_PER_PHASE12_7]', h12_7);
fprintf(fid, '// Filter for ratios close to 1\n'); fprintf(fid, '// Filter for ratios close to 1\n');
ExportFilterTaps(fid, 'fResTaps1[INTERP_DECIM_I_D1 * NUM_TAPS_PER_PHASE1]', h1); ExportFilterTaps(fid, 'fResTaps1[INTERP_DECIM_I_D1 * NUM_TAPS_PER_PHASE1]', h1);