ref: 8d9323d6456a57356e22a800aee354312e642bf4
parent: db4f5b7c07c0a1d67d8b62eb191efe96e7dc5a16
author: lenox <lenox>
date: Sat Jan 29 12:12:14 EST 2000
no message
--- a/imdct.c
+++ /dev/null
@@ -1,379 +1,0 @@
-
-#include <math.h>
-#include <stdlib.h>
-
-#include "tf_main.h"
-#include "transfo.h"
-#include "block.h"
-#include "dolby_win.h"
-
-#define DPI 3.14159265358979323846264338327950288
-
-double zero = 0;
-
-void vcopy( double src[], double dest[], int inc_src, int inc_dest, int vlen )
-{
- int i;
-
- for( i=0; i<vlen; i++ ) {
- *dest = *src;
- dest += inc_dest;
- src += inc_src;
- }
-}
-
-void vmult1(double src1[], double src2[], double dest[], int vlen )
-{
- int i;
-
- for( i=0; i<vlen; i++ ) {
- *dest = *src1 * *src2;
- dest++;
- src1++;
- src2++;
- }
-}
-
-void vmult2( double src1[], double src2[], double dest[], int vlen)
-{
- int i;
-
- for( i=0; i<vlen; i++ ) {
- *dest = *src1 * *src2;
- dest++;
- src1++;
- src2--;
- }
-}
-
-void vadd( double src1[], double src2[], double dest[],
- int inc_src1, int inc_src2, int inc_dest, int vlen )
-{
- int i;
-
- for( i=0; i<vlen; i++ ) {
- *dest = *src1 + *src2;
- dest += inc_dest;
- src1 += inc_src1;
- src2 += inc_src2;
- }
-}
-
-
-/* Calculate window */
-void calc_window( double window[], int len, Window_shape wfun_select )
-{
- int i;
- extern double dolby_win_1024[];
- extern double dolby_win_128[];
-
- switch(wfun_select)
- {
- case WS_FHG:
- for( i=0; i<len; i++ )
- window[i] = sin((DPI/(2*len)) * (i + 0.5));
- break;
-
- case WS_DOLBY:
- switch(len)
- {
- case BLOCK_LEN_SHORT:
- for( i=0; i<len; i++ )
- window[i] = dolby_win_128[i];
- break;
- case BLOCK_LEN_LONG:
- for( i=0; i<len; i++ )
- window[i] = dolby_win_1024[i];
- break;
- }
- break;
- }
-}
-
-#define MAX_SHIFT_LEN_LONG 4096
-
-/* %%%%%%%%%%%%%%%%% MDCT - STUFF %%%%%%%%%%%%%%%% */
-
-void mdct( double in_data[], double out_data[], int len )
-{
- vcopy(in_data, out_data, 1, 1, len);
- MDCT(out_data, len);
-}
-
-void buffer2freq(double p_in_data[],
- double p_out_mdct[],
- double p_overlap[],
- enum WINDOW_TYPE block_type,
- Window_shape wfun_select, /* offers the possibility to select different window functions */
- 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 /* YT 970615 for son_PP */
- )
-{
- 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_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 nflat_ms = (nmed-nshort) / 2;
- int transfak_ms = nmed/nshort;
-
- static Window_shape wfun_select_prev=WS_FHG;
- static int firstTime=1;
- window_short_prev_ptr = window_short_prev ;
-
- calc_window( window_long, nlong, wfun_select );
- calc_window( window_long_prev, nlong, wfun_select_prev );
- calc_window( window_short, nshort, wfun_select );
- calc_window( window_short_prev, nshort, wfun_select_prev );
-
- /* create / shift old values */
- /* We use p_overlap here as buffer holding the last frame time signal*/
- /* YT 970615 for son_pp */
- if(overlap_select != MNON_OVERLAPPED){
- 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{
- 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( block_type ) {
- case ONLY_LONG_WINDOW :
- vmult1( p_o_buf, window_long_prev, windowed_buf, nlong );
- vmult2( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, nlong );
- mdct( windowed_buf, p_out_mdct, 2*nlong );
- break;
-
- case LONG_SHORT_WINDOW :
- vmult1( p_o_buf, window_long_prev, windowed_buf, nlong );
- vcopy( p_o_buf+nlong, windowed_buf+nlong, 1, 1, nflat_ls );
- vmult2( p_o_buf+nlong+nflat_ls, window_short+nshort-1, windowed_buf+nlong+nflat_ls, nshort );
- vcopy( &zero, windowed_buf+2*nlong-1, 0, -1, nflat_ls );
- mdct( windowed_buf, p_out_mdct, 2*nlong );
- break;
-
- case SHORT_LONG_WINDOW :
- vcopy( &zero, windowed_buf, 0, 1, nflat_ls );
- vmult1( p_o_buf+nflat_ls, window_short_prev_ptr, windowed_buf+nflat_ls, nshort );
- vcopy( p_o_buf+nflat_ls+nshort, windowed_buf+nflat_ls+nshort, 1, 1, nflat_ls );
- vmult2( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, nlong );
- mdct( windowed_buf, p_out_mdct, 2*nlong );
- break;
-
- case ONLY_SHORT_WINDOW :
- if(overlap_select != MNON_OVERLAPPED){ /* YT 970615 for sonPP */
- p_o_buf += nflat_ls;
- }
- for (k=transfak_ls-1; k-->=0; ) {
- vmult1( p_o_buf, window_short_prev_ptr, windowed_buf, nshort );
- vmult2( p_o_buf+nshort, window_short+nshort-1, windowed_buf+nshort, nshort );
- mdct( windowed_buf, p_out_mdct, 2*nshort );
-
- p_out_mdct += nshort;
- /* YT 970615 for sonPP*/
- if(overlap_select != MNON_OVERLAPPED) p_o_buf += nshort;
- else p_o_buf += 2*nshort;
- window_short_prev_ptr = window_short;
- }
- break;
- }
-
- /* --- Save old window shape --- */
- wfun_select_prev = wfun_select;
-}
-
-void imdct(double in_data[], double out_data[], int len)
-{
- vcopy(in_data, out_data, 1, 1, len/2);
- IMDCT(out_data, len);
-}
-
-void freq2buffer(double p_in_data[],
- double p_out_data[],
- double p_overlap[],
- enum WINDOW_TYPE block_type,
- int nlong, /* shift length for long windows */
- int nmed, /* shift length for medium windows */
- int nshort, /* shift length for short windows */
- Window_shape wfun_select, /* offers the possibility to select different window functions */
- Mdct_in overlap_select /* select imdct output *TK* */
- /* switch (overlap_select) { */
- /* case OVERLAPPED: */
- /* p_out_data[] */
- /* = overlapped and added signal */
- /* (bufferlength: nlong) */
- /* case MNON_OVERLAPPED: */
- /* p_out_data[] */
- /* = non overlapped signal */
- /* (bufferlength: 2*nlong) */
- )
-{
- double *o_buf, transf_buf[ 2*MAX_SHIFT_LEN_LONG ];
- double overlap_buf[ 2*MAX_SHIFT_LEN_LONG ];
-
- double window_long[MAX_SHIFT_LEN_LONG];
- double window_long_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;
-
- double *fp;
- int k;
-
- int nflat_ls = (nlong-nshort)/ 2;
- int transfak_ls = nlong/nshort;
- int nflat_ms = (nmed-nshort) / 2;
- int transfak_ms = nmed/nshort;
-
- static Window_shape wfun_select_prev=WS_FHG;
- window_short_prev_ptr=window_short_prev ;
-
- calc_window( window_long, nlong, wfun_select );
- calc_window( window_long_prev, nlong, wfun_select_prev );
- calc_window( window_short, nshort, wfun_select );
- calc_window( window_short_prev_ptr, nshort, wfun_select_prev );
-
-
- /* Assemble overlap buffer */
- vcopy( p_overlap, overlap_buf, 1, 1, nlong );
- o_buf = overlap_buf;
-
-
- /* Separate action for each Block Type */
- switch( block_type ) {
- case ONLY_LONG_WINDOW :
- imdct( p_in_data, transf_buf, 2*nlong );
- vmult1( transf_buf, window_long_prev, transf_buf, nlong );
- if (overlap_select != MNON_OVERLAPPED) {
- vadd( transf_buf, o_buf, o_buf, 1, 1, 1, nlong );
- vmult2( transf_buf+nlong, window_long+nlong-1, o_buf+nlong, nlong );
- }
- else { /* overlap_select == NON_OVERLAPPED */
- vmult2( transf_buf+nlong, window_long+nlong-1, transf_buf+nlong, nlong );
- }
- break;
-
- case LONG_SHORT_WINDOW :
- imdct( p_in_data, transf_buf, 2*nlong );
- vmult1( transf_buf, window_long_prev, transf_buf, nlong );
- if (overlap_select != MNON_OVERLAPPED) {
- vadd( transf_buf, o_buf, o_buf, 1, 1, 1, nlong );
- vcopy( transf_buf+nlong, o_buf+nlong, 1, 1, nflat_ls );
- vmult2( transf_buf+nlong+nflat_ls, window_short+nshort-1, o_buf+nlong+nflat_ls, nshort );
- vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_ls );
- }
- else { /* overlap_select == NON_OVERLAPPED */
- vmult2( transf_buf+nlong+nflat_ls, window_short+nshort-1, transf_buf+nlong+nflat_ls, nshort );
- vcopy( &zero, transf_buf+2*nlong-1, 0, -1, nflat_ls );
- }
- break;
-
- case SHORT_LONG_WINDOW :
- imdct( p_in_data, transf_buf, 2*nlong );
- vmult1( transf_buf+nflat_ls, window_short_prev_ptr, transf_buf+nflat_ls, nshort );
- if (overlap_select != MNON_OVERLAPPED) {
- 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 );
- vmult2( transf_buf+nlong, window_long+nlong-1, o_buf+nlong, nlong );
- }
- else { /* overlap_select == NON_OVERLAPPED */
- vcopy( &zero, transf_buf, 0, 1, nflat_ls);
- vmult2( transf_buf+nlong, window_long+nlong-1, transf_buf+nlong, nlong);
- }
- break;
-
- case ONLY_SHORT_WINDOW :
- if (overlap_select != MNON_OVERLAPPED) {
- fp = o_buf + nflat_ls;
- }
- else { /* overlap_select == NON_OVERLAPPED */
- fp = transf_buf;
- }
- for( k = transfak_ls-1; k-->= 0; ) {
- if (overlap_select != MNON_OVERLAPPED) {
- imdct( p_in_data, transf_buf, 2*nshort );
- vmult1( transf_buf, window_short_prev_ptr, transf_buf, nshort );
- vadd( transf_buf, fp, fp, 1, 1, 1, nshort );
- vmult2( transf_buf+nshort, window_short+nshort-1, fp+nshort, nshort );
- p_in_data += nshort;
- fp += nshort;
- window_short_prev_ptr = window_short;
- }
- else { /* overlap_select == NON_OVERLAPPED */
- imdct( p_in_data, fp, 2*nshort );
- vmult1( fp, window_short_prev_ptr, fp, nshort );
- vmult2( fp+nshort, window_short+nshort-1, fp+nshort, 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 (overlap_select != MNON_OVERLAPPED) {
- vcopy( o_buf, p_out_data, 1, 1, nlong );
- }
- else { /* overlap_select == NON_OVERLAPPED */
- vcopy( transf_buf, p_out_data, 1, 1, 2*nlong );
- }
-
- /* save unused output data */
- vcopy( o_buf+nlong, p_overlap, 1, 1, nlong );
-
- /* --- Save old window shape --- */
- wfun_select_prev = wfun_select;
-}
-
-/***********************************************************************************************/
-
-void specFilter (double p_in[],
- double p_out[],
- int samp_rate,
- int lowpass_freq,
- int specLen
- )
-{
- float lowpass;
- int xlowpass,i;
-
- /* calculate the last line which is not zero */
- lowpass = (float)lowpass_freq * (float)specLen;
- lowpass /= (samp_rate>>1);
- lowpass += 1.0; /* round up to ensure that the desired upper frequency limit is correct */
- xlowpass = ((int)lowpass < specLen) ? (int)lowpass : specLen ;
-
- if( p_out != p_in ) {
- for (i = 0; i < specLen; i++ ) {
- p_out[i] = p_in[i];
- }
- }
- for (i = xlowpass; i <specLen ; i++ ) {
- p_out[i] = 0;
- }
-}
\ No newline at end of file