📄 son_gc_compensate.c
字号:
/*******************************************************************This software module was originally developed byYoshiaki Oikawa (Sony Corporation) andMitsuyuki Hatanaka (Sony Corporation)and edited byTakashi Koike (Sony Corporation)in the course of development of the MPEG-2 NBC/MPEG-4 System/MPEG-4Video/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 3. Thissoftware module is an implementation of a part of one or more MPEG-2NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio tools as specified by theMPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio standard. ISO/IECgives users of the MPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audiostandards free license to this software module or modificationsthereof for use in hardware or software products claiming conformanceto the MPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audiostandards. Those intending to use this software module in hardware orsoftware products are advised that this use may infringe existingpatents. The original developer of this software module and his/hercompany, the subsequent editors and their companies, and ISO/IEC haveno liability for use of this software module or modifications thereofin an implementation. Copyright is not released for non MPEG-2NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio conforming products.Theoriginal developer retains full right to use the code for his/her ownpurpose, assign or donate the code to a third party and to inhibitthird party from using the code for non MPEG-2 NBC/MPEG-4System/MPEG-4 Video/MPEG-4 Audio conforming products. This copyrightnotice must be included in all copies or derivative works.Copyright (C) 1996.*******************************************************************/#include <stdio.h>#include <stdlib.h>#include "buffersHandle.h" /* handler, defines, enums */#include "resilienceHandle.h" /* handler, defines, enums */#include "tf_mainHandle.h" /* handler, defines, enums */#include "common_m4a.h"#include "sony_local.h"void son_gainc_window(int, GAINC, GAINC, GAINC, double *, int);void son_gc_compensate_sub( double input[], GAINC *gain_data[], int block_size_samples, int window_sequence, int ch, int band, double *gcOverlapBufferCh[], double *out[] ){ int i,j,k; /* These parameter will be removed outside */ static GAINC gain_data_prev[MAX_TIME_CHANNELS][NBANDS]; static int init_flag = 0; double *a_gcwind; a_gcwind = (double *)calloc(block_size_samples/NBANDS*2, sizeof(double)); if(init_flag == 0){ for(i = 0; i < NBANDS ; i++){ gain_data_prev[ch][i].natks = 0; } init_flag = 1; } switch(window_sequence){ case ONLY_LONG_SEQUENCE: /* Gain function making routine */ son_gainc_window(block_size_samples/NBANDS*2, gain_data_prev[ch][band], gain_data[band][0], gain_data[band][0], a_gcwind, ONLY_LONG_SEQUENCE); /* Gain compensating routine */ for( j = 0; j < block_size_samples/NBANDS*2; j++){ input[band*block_size_samples/NBANDS*2+j] *=a_gcwind[j]; } /* Overlapping routine */ for( j = 0; j < block_size_samples/NBANDS; j++){ out[band][j] = gcOverlapBufferCh[band][j]+input[band*block_size_samples/NBANDS*2+j]; } /* Shift Previous data */ for( j = 0; j < block_size_samples/NBANDS; j++){ gcOverlapBufferCh[band][j] = input[band*block_size_samples/NBANDS*2+block_size_samples/NBANDS+j]; } gain_data_prev[ch][band] = gain_data[band][0]; break; case LONG_START_SEQUENCE: /* Gain function making routine */ son_gainc_window(block_size_samples/NBANDS*2, gain_data_prev[ch][band], gain_data[band][0], gain_data[band][1], a_gcwind, LONG_START_SEQUENCE); /* Gain compensating routine */ for( j = 0; j < block_size_samples/NBANDS*2; j++){ input[band*block_size_samples/NBANDS*2+j] *=a_gcwind[j]; } /* Overlapping routine */ for( j = 0; j < block_size_samples/NBANDS; j++){ out[band][j] = gcOverlapBufferCh[band][j] + input[band*block_size_samples/NBANDS*2+j]; } /* Shift Previous data */ for( j = 0; j < block_size_samples/NBANDS; j++){ gcOverlapBufferCh[band][j] = input[band*block_size_samples/NBANDS*2+block_size_samples/NBANDS+j]; } gain_data_prev[ch][band] = gain_data[band][1]; break; case LONG_STOP_SEQUENCE: /* Gain function making routine */ son_gainc_window(block_size_samples/NBANDS*2, gain_data_prev[ch][band], gain_data[band][0], gain_data[band][1], a_gcwind, LONG_STOP_SEQUENCE); /* Gain compensating routine */ for( j = 0; j < block_size_samples/NBANDS*2; j++){ input[band*block_size_samples/NBANDS*2+j] *= a_gcwind[j]; } /* Overlapping rouitne */ for( j = 0; j < block_size_samples/NBANDS; j++){ out[band][j] = gcOverlapBufferCh[band][j] + input[band*block_size_samples/NBANDS*2+j]; } /* Shift Previous data */ for( j = 0; j < block_size_samples/NBANDS; j++){ gcOverlapBufferCh[band][j] = input[band*block_size_samples/NBANDS*2+block_size_samples/NBANDS+j]; } gain_data_prev[ch][band] = gain_data[band][1]; break; case EIGHT_SHORT_SEQUENCE: for(k = 0; k < SHORT_WIN_IN_LONG; k++){ /* Gain function making routine */ son_gainc_window(block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2, gain_data_prev[ch][band], gain_data[band][k], gain_data[band][k], a_gcwind, EIGHT_SHORT_SEQUENCE); /* Gain compensating routine */ for( j = 0; j < block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2; j++){ input[band*block_size_samples/NBANDS*2+k*block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2+j] *= a_gcwind[j]; } /* Overlapping rouitne */ for( j = 0; j < block_size_samples/SHORT_WIN_IN_LONG/NBANDS; j++){ gcOverlapBufferCh[band][j+block_size_samples/NBANDS*7/16+block_size_samples/SHORT_WIN_IN_LONG/NBANDS*k] += input[band*block_size_samples/NBANDS*2+k*block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2+j]; } /* Shift Previous data */ for( j = 0; j < block_size_samples/SHORT_WIN_IN_LONG/NBANDS; j++){ gcOverlapBufferCh[band][j+block_size_samples/NBANDS*7/16+block_size_samples/SHORT_WIN_IN_LONG/NBANDS*(k+1)] = input[band*block_size_samples/NBANDS*2+k*block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2+block_size_samples/SHORT_WIN_IN_LONG/NBANDS+j]; } gain_data_prev[ch][band] = gain_data[band][k]; } for(j = 0; j < block_size_samples/NBANDS; j++){ out[band][j] = gcOverlapBufferCh[band][j]; } for(j = 0; j < block_size_samples/NBANDS; j++){ gcOverlapBufferCh[band][j] = gcOverlapBufferCh[band][j+block_size_samples/NBANDS]; } break; default: CommonExit(1, "gc_compensate: ERROR! Illegal Window Type \n"); break; } free(a_gcwind);}void son_gc_compensate( double timeSigChWithGC[], GAINC *gainInfoCh[], int block_size_samples, int window_sequence, int ch, double *gcOverlapBufferCh[], double *bandSigCh[], int ssr_decoder_band ){ int i; for ( i = 0; i < ssr_decoder_band; i++) { son_gc_compensate_sub(timeSigChWithGC, gainInfoCh, block_size_samples, window_sequence, ch, i, gcOverlapBufferCh, bandSigCh); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -