xorg1990
New member
Ich habe mal kurz eine frage zu eien C code snippet wo ich nicht durchblicke.
Die Frage ist was passiert hier:
f zeigt auf delay_line was in init_cFIR angelegt wurde. Aber delay line ist doch Complex müsste die schleife nicht durch delay_line.im und delay_line.re laufen.
Und wieso überhaupt result->delay_line.re = 0.0; und nicht result->delay_line.re = 0.0;?
Wie müste die Berechnug in JS aussehen so:
und dann?so?:
Code:
struct FIR {
float *coeffs;
int filterLength;
float *delay_line;
};
typedef struct _cpx {
float re;
float im;
} TYPECPX;
struct cFIR {
float *coeffs;
int filterLength;
TYPECPX *delay_line;
float rms;
struct cFIR* init_cfir( int coeffs_len, float *coeff_tab )
{
struct cFIR *result;
int i;
// alloc and init buffers
result = (struct cFIR *)malloc( sizeof( struct cFIR ));
result->filterLength = coeffs_len ;
result->coeffs = (float*)malloc( coeffs_len * sizeof( float));
result->delay_line = (TYPECPX*)malloc( coeffs_len * sizeof( TYPECPX));
// copy coeffs to struct
for( i=0 ; i < coeffs_len ; i++ ) {
result->delay_line[i].re = 0.0;
result->delay_line[i].im = 0.0;
result->coeffs[i] = coeff_tab[i];
}
return( result );
}
TYPECPX cfir_filt( struct cFIR* f, TYPECPX in )
{
int i;
TYPECPX acc;
float *pt_coeffs, rms;
TYPECPX *pt_sample;
int L;
// shift input left for one sample
L = f->filterLength;
for( i=0 ; i < L - 1 ; i++ ){
f->delay_line[i] = f->delay_line[i+1];
}
// add new sample to the end of delay line
f->delay_line[ L - 1 ] = in;
};
Die Frage ist was passiert hier:
Code:
for( i=0 ; i < L - 1 ; i++ ){
f->delay_line[i] = f->delay_line[i+1];
}
f zeigt auf delay_line was in init_cFIR angelegt wurde. Aber delay line ist doch Complex müsste die schleife nicht durch delay_line.im und delay_line.re laufen.
Und wieso überhaupt result->delay_line.re = 0.0; und nicht result->delay_line.re = 0.0;?
Wie müste die Berechnug in JS aussehen so:
Code:
function init_cFIR(coeffsLength, t){
this.cFIR = {};
var filtLength = coeffsLength;
var delayLine = {};
delayLine.prototype.re = new Float32Array(filtLength);
delayLine.prototype.im = new Float32Array(filtLength);
var coeffs = new Float32Array(filtLength);
for(var i=0;i<filtLength;i++){
delayLine.re[i] = 0.0;
delayLine.im[i] = 0.0;
coeffs[i] = t[i];
}
this.cFIR.delayLine = delayLine;
this.cFIR.coeffs = coeffs;
und dann?so?:
Code:
function cfir_filt(cFIR, inp){
var i;
cplx.im = 0.0;
cplx.re = 0.0;
var coeffs_ptr = 0;
var sample_ptr = 0;
for(i=0;i<filtLength-1;i++){
delayLine.re[i] = delayLine.re[i+1];
delayLine.im[i] = delayLine.im[i+1];
}
delayLine.re[filtLength-1] = inp.re;
delayLine.im[filtLength-1] = inp.im;