feafiltsupp.c
来自「speech signal process tools」· C语言 代码 · 共 552 行 · 第 1/2 页
C
552 行
feafilt_rec->zeros[i].imag = 0; } } /* Next 12 lines do nothing to change FILT_BS zeros, but Need these 'magic' lines, or run time error for FILT_BS, IIR, order 3, wideband 1000-3000 */ if(type == FILT_BS){ for(i=0;i<*feafilt_rec->zero_dim; i++){ tmp[i].real = feafilt_rec->zeros[i].real; tmp[i].imag = feafilt_rec->zeros[i].imag; } feafilt_rec->zeros = (double_cplx *) realloc( (void *) feafilt_rec->zeros,numc *sizeof(double_cplx)); for(i=0; i<*feafilt_rec->zero_dim; i++){ feafilt_rec->zeros[i].real = tmp[i].real; feafilt_rec->zeros[i].imag = tmp[i].imag; } } /* A wideband filter, odd order. See7.25, 7.23 Parks & Burrus */ for(i=0; i<*feafilt_rec->pole_dim; i++) if( feafilt_rec->poles[i].imag == 0) chpole = i; if(chpole >= 0){ num = *feafilt_rec->pole_dim; *feafilt_rec->pole_dim = numc = num+1; for(i=0;i<num;i++){ /* need this awkward tmp, due to realloc distroys data */ tmp[i].real = feafilt_rec->poles[i].real; tmp[i].imag = feafilt_rec->poles[i].imag; } feafilt_rec->poles = (double_cplx *) realloc((void *)feafilt_rec->poles,numc *sizeof(double_cplx)); spsassert(feafilt_rec->poles, "get_feafilt_rec: feafilt_rec->poles malloc fails"); for(i=0;i<num;i++){ feafilt_rec->poles[i].real = tmp[i].real; feafilt_rec->poles[i].imag = tmp[i].imag; } feafilt_rec->poles[numc-1].real= tmp[chpole].real; feafilt_rec->poles[numc-1].imag = 0; } break; defaults: break; } } } } return(status); }struct zfuncfeafilt_to_zfunc( feafiltrec ) struct feafilt *feafiltrec;{ struct zfunc res; int k; spsassert( feafiltrec != NULL, "feafiltrec_to_zfunc: passed null feafilt rec."); res.nsiz = *feafiltrec->num_size; res.dsiz = *feafiltrec->denom_size; if ( res.nsiz ) { res.zeros = (float *) calloc( res.nsiz, sizeof(float)); spsassert( res.zeros != NULL, "feafiltrec_to_zfunc: can't allocate zeros."); } for (k=0; k<res.nsiz; k++) res.zeros[k] = feafiltrec->re_num_coeff[k]; if (res.dsiz) { res.poles = (float *) calloc( res.dsiz, sizeof(float)); spsassert( res.poles != NULL, "feafiltrec_to_zfunc: can't allocate poles."); } for (k=0; k<res.dsiz; k++) res.poles[k] = feafiltrec->re_denom_coeff[k]; return( res );}voidprint_feafilt_rec(p, hd, file)struct feafilt *p;struct header *hd;FILE *file;{ short *filter_complex, *define_pz, j, i; long max_num, max_denom; char **xfields; spsassert(p, "print_feafilt_rec: p is NULL"); spsassert(hd, "print_feafilt_rec: hd is NULL"); spsassert(file, "print_feafilt_rec: file is NULL"); max_num = get_genhd_val("max_num", hd, -1.0); max_denom = get_genhd_val("max_denom", hd, -1.0); filter_complex = get_genhd_s("filter_complex", hd); define_pz = get_genhd_s("define_pz", hd); if (!filter_complex) { fprintf(file, "Warning: header item filter_complex is missing.\n"); filter_complex = (short *)calloc(1,sizeof(short)); } if (!define_pz) { fprintf(file, "Warning: header item define_pz is missing.\n"); define_pz = (short *)calloc(1,sizeof(short)); } if (max_num == -1) { fprintf(file, "Warning: header item max_num is missing.\n"); max_num = 0; } if (max_denom == -1) { fprintf(file, "Warning: header item max_denom is missing.\n"); max_denom = 0; } spsassert(p->num_size,"field num_size missing."); spsassert(p->denom_size,"field denom_size missing."); if(*define_pz) { spsassert(p->pole_dim, "field pole_dim missing w/ define_pz true"); spsassert(p->zero_dim, "field zero_dim missing w/ define_pz true"); } fprintf(file, "num_size: %d, denom_size: %d", *(p->num_size), *(p->denom_size)); if (*define_pz) fprintf(file, ", zero_dim: %d, pole_dim: %d\n", *(p->zero_dim), *(p->pole_dim)); else fprintf(file, "\n"); if (*(p->num_size)) { fprintf(file, "\nre_num_coeff:\n 0: "); j=1; for(i=0; i<*(p->num_size); i++) { fprintf(file, "%10.5lg ",p->re_num_coeff[i]); if(j++ == 5 && i+1<*(p->num_size)) { fprintf(file,"\n%3d: ",i+1); j=1; } } fprintf(file,"\n"); } if (*filter_complex && *(p->num_size)) { fprintf(file, "\nim_num_coeff:\n 0: "); j=1; for(i=0; i<*(p->num_size); i++) { fprintf(file, "%10.5lg ",p->im_num_coeff[i]); if(j++ == 5 && i+1<*(p->num_size)) { fprintf(file,"\n%3d: ",i+1); j=1; } } fprintf(file,"\n"); } if (*(p->denom_size)) { fprintf(file, "\nre_denom_coeff:\n 0: "); j=1; for(i=0; i<*(p->denom_size); i++) { fprintf(file, "%10.5lg ",p->re_denom_coeff[i]); if(j++ == 5 && i+1<*(p->denom_size)) { fprintf(file,"\n%3d: ",i+1); j=1; } } fprintf(file,"\n"); } if (*filter_complex && *(p->denom_size)) { fprintf(file, "\nim_denom_coeff:\n 0: "); j=1; for(i=0; i<*(p->denom_size); i++) { fprintf(file, "%10.5lg ",p->im_denom_coeff[i]); if(j++ == 5 && i+1<*(p->denom_size)) { fprintf(file,"\n%3d: ",i+1); j=1; } } fprintf(file,"\n"); } if (*define_pz && *(p->zero_dim)) { fprintf(file, "\nzeros:\n 0: "); j=1; for(i=0; i<*(p->zero_dim); i++) { fprintf(file, "[%10.5lg,%10.5g] ",p->zeros[i].real,p->zeros[i].imag); if(j++ == 2 && i+1<*(p->zero_dim)) { fprintf(file,"\n%3d: ",i+1); j=1; } } fprintf(file,"\n"); } if (*define_pz && *(p->pole_dim)) { fprintf(file, "\npoles:\n 0: "); j=1; for(i=0; i<*(p->pole_dim); i++) { fprintf(file, "[%10.5lg,%10.5g] ",p->poles[i].real,p->poles[i].imag); if(j++ == 2 && i+1<*(p->pole_dim)) { fprintf(file,"\n%3d: ",i+1); j=1; } } fprintf(file,"\n"); }/* print any fields that are not part of the standard fea_filt file here */ xfields = get_feafilt_xfields(hd); print_fea_recf(p->fea_rec, hd, file, xfields); free_feafilt_xfields(xfields);} staticchar *standard_fields[] = {"num_size", "denom_size", "zero_dim", "pole_dim", "re_num_coeff", "im_num_coeff", "re_denom_coeff", "im_denom_coeff", "zeros", "poles", NULL};char **get_feafilt_xfields(hd)struct header *hd;{char **list;int list_size = 1;long i,j; spsassert(hd, "get_feafilt_xfields: hd is NULL"); spsassert(hd->common.type == FT_FEA && hd->hd.fea->fea_type == FEA_FILT, "get_feafilt_xfields: hd is not FEA or not FEA_FILT"); list = (char **)malloc(sizeof(char *)); list[0] = NULL; for (i=0; hd->hd.fea->names[i] != NULL; i++) { for (j=0; standard_fields[j] != NULL; j++) { if (strcmp(hd->hd.fea->names[i], standard_fields[j]) == 0) break; } if (standard_fields[j] == NULL) { list = (char **)realloc((char *)list, (list_size+1)*sizeof(char *)); list[list_size-1] = savestring(hd->hd.fea->names[i]); list[list_size++] = NULL; } } return list;}voidfree_feafilt_xfields(list) char **list;{ int i; for (i = 0; list[i]; i++) free(list[i]); free((char *) list);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?