📄 imdct.c
字号:
vmult( transf_buf+nlong, window_long+nlong-1, transf_buf+nlong, 1, -1, 1, nlong ); } break; case LONG_START_SEQUENCE : imdct( p_in_data, transf_buf, 2*nlong ); vmult( transf_buf, window_long_prev, transf_buf, 1, 1, 1, nlong ); if (overlap_select != NON_OVERLAPPED_MODE) { vadd( transf_buf, o_buf, o_buf, 1, 1, 1, nlong ); vcopy( transf_buf+nlong, o_buf+nlong, 1, 1, nflat_ls ); vmult( transf_buf+nlong+nflat_ls, window_short+nshort-1, o_buf+nlong+nflat_ls, 1, -1, 1, nshort ); vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_ls ); } else { /* overlap_select == NON_OVERLAPPED_MODE */ vmult( transf_buf+nlong+nflat_ls, window_short+nshort-1, transf_buf+nlong+nflat_ls, 1, -1, 1, nshort ); vcopy( &zero, transf_buf+2*nlong-1, 0, -1, nflat_ls ); } break; case LONG_STOP_SEQUENCE : imdct( p_in_data, transf_buf, 2*nlong ); vmult( transf_buf+nflat_ls, window_short_prev_ptr, transf_buf+nflat_ls, 1, 1, 1, nshort ); if (overlap_select != NON_OVERLAPPED_MODE) { vadd( transf_buf+nflat_ls, o_buf+nflat_ls, o_buf+nflat_ls, 1, 1, 1, nshort ); vcopy( transf_buf+nflat_ls+nshort, o_buf+nflat_ls+nshort, 1, 1, nflat_ls ); vmult( transf_buf+nlong, window_long+nlong-1, o_buf+nlong, 1, -1, 1, nlong ); } else { /* overlap_select == NON_OVERLAPPED_MODE */ vcopy( &zero, transf_buf, 0, 1, nflat_ls); vmult( transf_buf+nlong, window_long+nlong-1, transf_buf+nlong, 1, -1, 1, nlong); } break; case EIGHT_SHORT_SEQUENCE : {int ii; for(ii=0; ii<2*nlong; ii++) transf_buf[ii]=0;} if (overlap_select != NON_OVERLAPPED_MODE) { fp = o_buf + nflat_ls; } else { /* overlap_select == NON_OVERLAPPED_MODE */ fp = transf_buf; } for( k = num_short_win-1; k-->= 0; ) { if (overlap_select != NON_OVERLAPPED_MODE) { imdct( p_in_data, transf_buf, 2*nshort ); vmult( transf_buf, window_short_prev_ptr, transf_buf, 1, 1, 1, nshort ); vadd( transf_buf, fp, fp, 1, 1, 1, nshort ); vmult( transf_buf+nshort, window_short+nshort-1, fp+nshort, 1, -1, 1, nshort ); p_in_data += nshort; fp += nshort; window_short_prev_ptr = window_short; } else { /* overlap_select == NON_OVERLAPPED_MODE */ imdct( p_in_data, fp, 2*nshort ); vmult( fp, window_short_prev_ptr, fp, 1, 1, 1, nshort ); vmult( fp+nshort, window_short+nshort-1, fp+nshort, 1, -1, 1, nshort ); p_in_data += nshort; fp += 2*nshort; window_short_prev_ptr = window_short; } } vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_ls ); break; #if 0 /* not used anymore */ case LONG_MEDIUM_WINDOW : imdct( p_in_data, transf_buf, 2*nlong ); vmult( transf_buf, window_long_prev, transf_buf, 1, 1, 1, nlong ); vadd( transf_buf, o_buf, o_buf, 1, 1, 1, nlong ); vcopy( transf_buf+nlong, o_buf+nlong, 1, 1, nflat_lm ); vmult( transf_buf+nlong+nflat_lm, window_med+nmed-1, o_buf+nlong+nflat_lm, 1, -1, 1, nmed ); vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_lm ); break; case MEDIUM_LONG_WINDOW : imdct( p_in_data, transf_buf, 2*nlong ); vmult( transf_buf+nflat_lm, window_med, transf_buf+nflat_lm, 1, 1, 1, nmed ); vadd( transf_buf+nflat_lm, o_buf+nflat_lm, o_buf+nflat_lm, 1, 1, 1, nmed ); vcopy( transf_buf+nflat_lm+nmed, o_buf+nflat_lm+nmed, 1, 1, nflat_lm ); vmult( transf_buf+nlong, window_long+nlong-1, o_buf+nlong, 1, -1, 1, nlong ); break; case ONLY_MEDIUM_WINDOW : fp = o_buf + nflat_lm; for( k = transfak_lm-1; k-->=0; ) { imdct( p_in_data, transf_buf, 2*nmed ); vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed ); vadd( transf_buf, fp, fp, 1, 1, 1, nmed ); vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed ); p_in_data += nmed; fp += nmed; } vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_lm ); break; case MEDIUM_SHORT_WINDOW : fp = o_buf + nflat_lm; for( k = transfak_lm-2; k-->=0; ) { /* NI */ imdct( p_in_data, transf_buf, 2*nmed ); vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed ); vadd( transf_buf, fp, fp, 1, 1, 1, nmed ); vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed ); p_in_data += nmed; fp += nmed; } imdct( p_in_data, transf_buf, 2*nmed ); vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed ); vadd( transf_buf, fp, fp, 1, 1, 1, nmed ); vcopy( transf_buf+nmed, fp+nmed, 1, 1, nflat_ms ); vmult( transf_buf+nmed+nflat_ms, window_short+nshort-1, fp+nmed+nflat_ms, 1, -1, 1, nshort ); break; case SHORT_MEDIUM_WINDOW : fp = o_buf + nflat_lm; imdct( p_in_data, transf_buf, 2*nmed ); vmult( transf_buf+nflat_ms, window_short_prev_ptr, transf_buf+nflat_ms, 1, 1, 1, nshort ); vadd( transf_buf+nflat_ms, fp+nflat_ms, fp+nflat_ms, 1, 1, 1, nshort ); vcopy( transf_buf+nflat_ms+nshort, fp+nflat_ms+nshort, 1, 1, nflat_ms ); vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed ); fp += nmed; p_in_data += nmed; for( k = transfak_lm-2; k-->=0; ) { /* NI */ imdct( p_in_data, transf_buf, 2*nmed ); vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed ); vadd( transf_buf, fp, fp, 1, 1, 1, nmed ); vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed ); p_in_data += nmed; fp += nmed; } break; #endif default : CommonExit( 1, "mdct_synthesis: Unknown window type(1)" ); } if (overlap_select != NON_OVERLAPPED_MODE) { vcopy( o_buf, p_out_data, 1, 1, nlong ); } else { /* overlap_select == NON_OVERLAPPED_MODE */ vcopy( transf_buf, p_out_data, 1, 1, 2*nlong ); } /* save unused output data */ if (overlap_select != NON_OVERLAPPED_MODE) vcopy( o_buf+nlong, p_overlap, 1, 1, nlong ); } /* %%%%%%%%%%%%%%%%% MDCT - STUFF %%%%%%%%%%%%%%%% */void mdct( double in_data[], double out_data[], int len ){ double *tmp_data; tmp_data = (double*)malloc(len*sizeof(double)); vcopy(in_data, tmp_data, 1, 1, len); MDCT(tmp_data, len, len/2, 1); vcopy(tmp_data, out_data, 1, 1, len/2); free(tmp_data);}void buffer2freq( double p_in_data[], double p_out_mdct[], double p_overlap[], WINDOW_SEQUENCE windowSequence, WINDOW_SHAPE wfun_select, /* offers the possibility to select different window functions */ WINDOW_SHAPE wfun_select_prev, int nlong, /* shift length for long windows */ int nmed, /* shift length for medium windows */ int nshort, /* shift length for short windows */ Mdct_in overlap_select, /* select mdct input *TK* */ /* switch (overlap_select) { */ /* case OVERLAPPED_MODE: */ /* p_in_data[] */ /* = overlapped signal */ /* (bufferlength: nlong) */ /* case NON_OVERLAPPED_MODE: */ /* p_in_data[] */ /* = non overlapped signal */ /* (bufferlength: 2*nlong) */ int num_short_win /* number of short windows to */ /* transform */ /*int save_window*/ /* save window information */){ double transf_buf[ 2*MAX_SHIFT_LEN_LONG ]; double windowed_buf[ 2*MAX_SHIFT_LEN_LONG ]; double *p_o_buf; int k; double window_long[MAX_SHIFT_LEN_LONG]; double window_long_prev[MAX_SHIFT_LEN_LONG]; double window_med[MAX_SHIFT_LEN_LONG]; double window_med_prev[MAX_SHIFT_LEN_LONG]; double window_short[MAX_SHIFT_LEN_LONG]; double window_short_prev[MAX_SHIFT_LEN_LONG]; double *window_short_prev_ptr; int nflat_ls = (nlong-nshort)/ 2; int transfak_ls = nlong/nshort; int transfak_lm = nlong/nmed; #if 0 /* not used anymore */ int nflat_lm = (nlong-nmed) / 2; int nflat_ms = (nmed-nshort) / 2; #endif static int firstTime=1; window_short_prev_ptr = window_short_prev ; if( (nlong%nshort) || (nlong > MAX_SHIFT_LEN_LONG) || (nshort > MAX_SHIFT_LEN_LONG/2) ) { CommonExit( 1, "mdct_analysis: Problem with window length" ); } if( (nlong%nmed) || (nmed%nshort) || (nmed > MAX_SHIFT_LEN_LONG/2) ) { CommonExit( 1, "mdct_analysis: Problem with window length" ); } if( transfak_lm%2 ) { CommonExit( 1, "mdct_analysis: Problem with window length" ); } if( windowSequence==EIGHT_SHORT_SEQUENCE && ( (num_short_win <= 0) || (num_short_win > transfak_ls) ) ) { CommonExit( 1, "mdct_analysis: Problem with number of short windows" ); } calc_window( window_long, nlong, wfun_select ); calc_window( window_long_prev, nlong, wfun_select_prev ); calc_window( window_med, nmed, wfun_select ); calc_window( window_med_prev, nmed, wfun_select_prev ); calc_window( window_short, nshort, wfun_select ); calc_window( window_short_prev, nshort, wfun_select_prev ); if (overlap_select != NON_OVERLAPPED_MODE) { /* create / shift old values */ /* We use p_overlap here as buffer holding the last frame time signal*/ if (firstTime){ firstTime=0; vcopy( &zero, transf_buf, 0, 1, nlong ); } else vcopy( p_overlap, transf_buf, 1, 1, nlong ); /* Append new data */ vcopy( p_in_data, transf_buf+nlong, 1, 1, nlong ); vcopy( p_in_data, p_overlap, 1, 1, nlong ); } else { /* overlap_select == NON_OVERLAPPED_MODE */ vcopy( p_in_data, transf_buf, 1, 1, 2*nlong); } /* Set ptr to transf-Buffer */ p_o_buf = transf_buf; /* Separate action for each Block Type */ switch( windowSequence ) { case ONLY_LONG_SEQUENCE : vmult( p_o_buf, window_long_prev, windowed_buf, 1, 1, 1, nlong ); vmult( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, 1, -1, 1, nlong ); mdct( windowed_buf, p_out_mdct, 2*nlong ); break; case LONG_START_SEQUENCE : vmult( p_o_buf, window_long_prev, windowed_buf, 1, 1, 1, nlong ); vcopy( p_o_buf+nlong, windowed_buf+nlong, 1, 1, nflat_ls ); vmult( p_o_buf+nlong+nflat_ls, window_short+nshort-1, windowed_buf+nlong+nflat_ls, 1, -1, 1, nshort ); vcopy( &zero, windowed_buf+2*nlong-1, 0, -1, nflat_ls ); mdct( windowed_buf, p_out_mdct, 2*nlong ); break; case LONG_STOP_SEQUENCE : vcopy( &zero, windowed_buf, 0, 1, nflat_ls ); vmult( p_o_buf+nflat_ls, window_short_prev_ptr, windowed_buf+nflat_ls, 1, 1, 1, nshort ); vcopy( p_o_buf+nflat_ls+nshort, windowed_buf+nflat_ls+nshort, 1, 1, nflat_ls ); vmult( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, 1, -1, 1, nlong ); mdct( windowed_buf, p_out_mdct, 2*nlong ); break; case EIGHT_SHORT_SEQUENCE : if (overlap_select != NON_OVERLAPPED_MODE) { p_o_buf += nflat_ls; } for (k=num_short_win-1; k-->=0; ) { vmult( p_o_buf, window_short_prev_ptr, windowed_buf, 1, 1, 1, nshort ); vmult( p_o_buf+nshort, window_short+nshort-1, windowed_buf+nshort, 1, -1, 1, nshort ); mdct( windowed_buf, p_out_mdct, 2*nshort ); p_out_mdct += nshort; p_o_buf += (overlap_select != NON_OVERLAPPED_MODE) ? nshort : 2*nshort; window_short_prev_ptr = window_short; } break;#if 0 /* not used anymore */ case LONG_MEDIUM_WINDOW : vmult( p_o_buf, window_long_prev, windowed_buf, 1, 1, 1, nlong ); vcopy( p_o_buf+nlong, windowed_buf+nlong, 1, 1, nflat_lm ); vmult( p_o_buf+nlong+nflat_lm, window_med+nmed-1, windowed_buf+nlong+nflat_lm, 1, -1, 1, nmed ); vcopy( &zero, windowed_buf+2*nlong-1, 0, -1, nflat_lm ); mdct( windowed_buf, p_out_mdct, 2*nlong ); break; case MEDIUM_LONG_WINDOW : vcopy( &zero, windowed_buf, 0, 1, nflat_lm ); vmult( p_o_buf+nflat_lm, window_med, windowed_buf+nflat_lm, 1, 1, 1, nmed ); vcopy( p_o_buf+nflat_lm+nmed, windowed_buf+nflat_lm+nmed, 1, 1, nflat_lm ); vmult( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, 1, -1, 1, nlong ); mdct( windowed_buf, p_out_mdct, 2*nlong ); break; case ONLY_MEDIUM_WINDOW : p_o_buf += nflat_lm; for( k=transfak_lm-1; k-->=0; ) { vmult( p_o_buf, window_med, windowed_buf, 1, 1, 1, nmed ); vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed ); mdct( windowed_buf, p_out_mdct, 2*nmed ); p_o_buf += nmed; p_out_mdct += nmed; } break; case MEDIUM_SHORT_WINDOW : p_o_buf += nflat_lm; for( k=transfak_lm-2; k-->=0; ) { /* NI */ vmult( p_o_buf, window_med, windowed_buf, 1, 1, 1, nmed ); vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed ); mdct( windowed_buf, p_out_mdct, 2*nmed ); p_o_buf += nmed; p_out_mdct += nmed; } vmult( p_o_buf, window_med, windowed_buf, 1, 1, 1, nmed ); vcopy( p_o_buf+nmed, windowed_buf+nmed, 1, 1, nflat_ms ); vmult( p_o_buf+nmed+nflat_ms, window_short+nshort-1, windowed_buf+nmed+nflat_ms, 1, -1, 1, nshort ); vcopy( &zero, windowed_buf+2*nmed-1, 0, -1, nflat_ms ); mdct( windowed_buf, p_out_mdct, 2*nmed ); break; case SHORT_MEDIUM_WINDOW : p_o_buf += nflat_lm; vcopy( &zero, windowed_buf, 0, 1, nflat_ms ); vmult( p_o_buf+nflat_ms, window_short_prev_ptr, windowed_buf+nflat_ms, 1, 1, 1, nshort ); vcopy( p_o_buf+nflat_ms+nshort, windowed_buf+nflat_ms+nshort, 1, 1, nflat_ms ); vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed ); mdct( windowed_buf, p_out_mdct, 2*nmed ); p_o_buf += nmed; p_out_mdct += nmed; for (k=transfak_lm-2; k-->=0; ) { /* NI */ vmult( p_o_buf, window_med, windowed_buf, 1, 1, 1, nmed ); vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed ); mdct( windowed_buf, p_out_mdct, 2*nmed ); p_o_buf += nmed; p_out_mdct += nmed; } break;#endif default : CommonExit( 1, "mdct_synthesis: Unknown window type (2)" ); } /* Set output data vcopy(transf_buf, p_out_mdct,1, 1, nlong); */ }/***********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -