📄 aac_filterbank_fp.c
字号:
/*//// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.//// Intel(R) Integrated Performance Primitives AAC Decode Sample for Windows*//// By downloading and installing this sample, you hereby agree that the// accompanying Materials are being provided to you under the terms and// conditions of the End User License Agreement for the Intel(R) Integrated// Performance Primitives product previously accepted by you. Please refer// to the file ipplic.htm located in the root directory of your Intel(R) IPP// product installation for more information.//// MPEG-4 and AAC are international standards promoted by ISO, IEC, ITU, ETSI// and other organizations. Implementations of these standards, or the standard// enabled platforms may require licenses from various entities, including// Intel Corporation.//*//********************************************************************/#include <stdlib.h>#include <math.h>#include "aac_filterbank_fp.h"#include "aac_wnd_tables_fp.h"/********************************************************************/AACStatus InitFilterbank(sFilterbank* pBlock, int mode){ int i; int j; int size, size_short, size_long; ippsZero_8u((Ipp8u*)pBlock, sizeof(sFilterbank)); if (pBlock == NULL) return AAC_ALLOC; size = 0; if (mode & FB_DECODER) { if (ippsMDCTInvInitAlloc_32f(&pBlock->p_mdct_inv_long, N_LONG) != ippStsOk) return AAC_ALLOC; if (ippsMDCTInvInitAlloc_32f(&pBlock->p_mdct_inv_short, N_SHORT) != ippStsOk) return AAC_ALLOC; if (ippsMDCTInvGetBufSize_32f(pBlock->p_mdct_inv_long, &size) != ippStsOk) return AAC_ALLOC; if (ippsMDCTInvGetBufSize_32f(pBlock->p_mdct_inv_short, &size_short) != ippStsOk) return AAC_ALLOC; if (size < size_short) size = size_short; } if (mode & FB_ENCODER) { if (ippsMDCTFwdInitAlloc_32f(&pBlock->p_mdct_fwd_long, N_LONG) != ippStsOk) return AAC_ALLOC; if (ippsMDCTFwdInitAlloc_32f(&pBlock->p_mdct_fwd_short, N_SHORT) != ippStsOk) return AAC_ALLOC; if (ippsMDCTFwdGetBufSize_32f(pBlock->p_mdct_fwd_long, &size_long) != ippStsOk) return AAC_ALLOC; if (ippsMDCTFwdGetBufSize_32f(pBlock->p_mdct_fwd_short, &size_short) != ippStsOk) return AAC_ALLOC; if (size < size_long) size = size_long; if (size < size_short) size = size_short; } if (size != 0) { pBlock->p_buffer_inv = ippsMalloc_8u(size); pBlock->p_buffer_fwd = pBlock->p_buffer_inv; } for (i = 0; i < N_SHORT; i++) { pBlock->sin_short_wnd_table[i] = (float)sin(PI/(2.0f * N_SHORT/2) * (i + 0.5)); } for (i = 0; i < N_LONG; i++) { pBlock->sin_long_wnd_table[i] = (float)sin(PI/(2.0f * N_LONG/2) * (i + 0.5)); } for (i = 0, j = (N_SHORT)-1; i < N_SHORT /2; i++, j--) { pBlock->KBD_short_wnd_table[j] = pBlock->KBD_short_wnd_table[i] = KBD_short[i]; } for (i = 0, j = (N_LONG)-1; i < N_LONG/2; i++, j--) { pBlock->KBD_long_wnd_table[j] = pBlock->KBD_long_wnd_table[i] = KBD_long[i]; } return AAC_OK;}/********************************************************************/void FreeFilterbank(sFilterbank* pBlock){ if (pBlock->p_mdct_inv_long) ippsMDCTInvFree_32f(pBlock->p_mdct_inv_long); if (pBlock->p_mdct_inv_short) ippsMDCTInvFree_32f(pBlock->p_mdct_inv_short); if (pBlock->p_mdct_fwd_long) ippsMDCTFwdFree_32f(pBlock->p_mdct_fwd_long); if (pBlock->p_mdct_fwd_short) ippsMDCTFwdFree_32f(pBlock->p_mdct_fwd_short); if (pBlock->p_buffer_inv) ippsFree(pBlock->p_buffer_inv);}/********************************************************************/void FilterbankDec(sFilterbank* p_data, float* p_in_spectrum, float* p_in_prev_samples, int window_sequence, int window_shape, int prev_window_shape, float* p_out_samples_1st_part, float* p_out_samples_2nd_part){ Ipp32f samples[N_LONG]; Ipp32f* p_samples; Ipp32f* p_spectrum; Ipp32f *window_table_long, *prev_window_table_long; Ipp32f *window_table_short, *prev_window_table_short; Ipp32f mdct_out_short[N_SHORT]; int j; if (0 == window_shape) { window_table_long = p_data->sin_long_wnd_table; window_table_short = p_data->sin_short_wnd_table; } else { window_table_long = p_data->KBD_long_wnd_table; window_table_short = p_data->KBD_short_wnd_table; } if (0 == prev_window_shape) { prev_window_table_long = p_data->sin_long_wnd_table; prev_window_table_short = p_data->sin_short_wnd_table; } else { prev_window_table_long = p_data->KBD_long_wnd_table; prev_window_table_short = p_data->KBD_short_wnd_table; } switch(window_sequence) { case ONLY_LONG_SEQUENCE: ippsMDCTInv_32f(p_in_spectrum, samples, p_data->p_mdct_inv_long, p_data->p_buffer_inv); ippsMul_32f(prev_window_table_long, samples, p_out_samples_1st_part, N_LONG/2); ippsAdd_32f_I(p_in_prev_samples,p_out_samples_1st_part,N_LONG/2); ippsMul_32f(&window_table_long[N_LONG/2], &samples[N_LONG/2], p_out_samples_2nd_part, N_LONG/2); break; case LONG_START_SEQUENCE: ippsMDCTInv_32f(p_in_spectrum, samples, p_data->p_mdct_inv_long, p_data->p_buffer_inv); ippsMul_32f(prev_window_table_long, samples, p_out_samples_1st_part, N_LONG/2); ippsAdd_32f_I(p_in_prev_samples, p_out_samples_1st_part, N_LONG/2); ippsCopy_32f(&samples[N_LONG / 2], p_out_samples_2nd_part, ((3*N_LONG-N_SHORT)/4-N_LONG/2)); ippsMul_32f(&window_table_short[N_SHORT / 2], &samples[(3*N_LONG-N_SHORT)/4], &p_out_samples_2nd_part[((3*N_LONG-N_SHORT)/4-N_LONG/2)], N_SHORT/2); ippsZero_32f(&p_out_samples_2nd_part[(3*N_LONG+N_SHORT)/4-N_LONG/2], N_LONG-(3*N_LONG+N_SHORT)/4); break; case LONG_STOP_SEQUENCE: ippsMDCTInv_32f(p_in_spectrum, samples, p_data->p_mdct_inv_long, p_data->p_buffer_inv); ippsZero_32f(p_out_samples_1st_part, (N_LONG-N_SHORT)/4); ippsMul_32f(prev_window_table_short, &samples[(N_LONG-N_SHORT)/4], &p_out_samples_1st_part[(N_LONG-N_SHORT)/4], N_SHORT/2); ippsCopy_32f(&samples[(N_LONG+N_SHORT)/4], &p_out_samples_1st_part[(N_LONG + N_SHORT)/4], ((N_LONG/2)-((N_LONG+N_SHORT)/4))); ippsAdd_32f_I(p_in_prev_samples, p_out_samples_1st_part, N_LONG/2); ippsMul_32f(&window_table_long[N_LONG/2], &samples[N_LONG/2], p_out_samples_2nd_part, N_LONG/2); break; case EIGHT_SHORT_SEQUENCE: p_samples = samples; p_spectrum = p_in_spectrum; ippsZero_32f(p_samples, N_LONG); p_samples += (N_LONG - N_SHORT) / 4; ippsMDCTInv_32f(p_spectrum, (Ipp32f*)mdct_out_short, p_data->p_mdct_inv_short, p_data->p_buffer_inv); ippsMul_32f(prev_window_table_short, mdct_out_short, p_samples, N_SHORT/2); ippsMul_32f(&window_table_short[N_SHORT/2], &mdct_out_short[N_SHORT/2], &p_samples[N_SHORT/2],N_SHORT/2); p_samples += N_SHORT/2; p_spectrum += N_SHORT/2; for (j = 1; j < 8; j++) { ippsMDCTInv_32f(p_spectrum, (Ipp32f*)mdct_out_short, p_data->p_mdct_inv_short, p_data->p_buffer_inv); ippsMul_32f_I(window_table_short,(Ipp32f*)mdct_out_short, N_SHORT); ippsAdd_32f_I((Ipp32f*)mdct_out_short, p_samples, N_SHORT); p_samples += N_SHORT/2; p_spectrum += N_SHORT/2; } ippsAdd_32f(p_in_prev_samples, samples, p_out_samples_1st_part, N_LONG/2); ippsCopy_32f(&samples[N_LONG/2], p_out_samples_2nd_part, N_LONG/2); break; }}/********************************************************************/void FilterbankEnc(sFilterbank* p_data, float* p_in_samples_1st_part, float* p_in_samples_2nd_part, int window_sequence, int window_shape, int prev_window_shape, float* p_out_spectrum, int ltp){ float mdct_in[N_LONG]; Ipp32f *window_table_long, *prev_window_table_long; Ipp32f *window_table_short, *prev_window_table_short; int i; if (0 == window_shape) { window_table_long = p_data->sin_long_wnd_table; window_table_short = p_data->sin_short_wnd_table; } else { window_table_long = p_data->KBD_long_wnd_table; window_table_short = p_data->KBD_short_wnd_table; } if (0 == prev_window_shape) { prev_window_table_long = p_data->sin_long_wnd_table; prev_window_table_short = p_data->sin_short_wnd_table; } else { prev_window_table_long = p_data->KBD_long_wnd_table; prev_window_table_short = p_data->KBD_short_wnd_table; } switch(window_sequence) { case ONLY_LONG_SEQUENCE: ippsMul_32f(p_in_samples_1st_part, prev_window_table_long, mdct_in, N_LONG/2); ippsMul_32f(p_in_samples_2nd_part, &window_table_long[N_LONG/2], &mdct_in[N_LONG/2], N_LONG/2); ippsMDCTFwd_32f(mdct_in, p_out_spectrum, p_data->p_mdct_fwd_long, p_data->p_buffer_fwd); break; case LONG_START_SEQUENCE: ippsMul_32f(p_in_samples_1st_part, prev_window_table_long, mdct_in, N_LONG/2); ippsCopy_32f(p_in_samples_2nd_part, &mdct_in[1024], 1472-1024); ippsMul_32f(&p_in_samples_2nd_part[1472-1024], &window_table_short[N_SHORT/2], &mdct_in[1472], 1600-1472); ippsZero_32f(&mdct_in[1600], (2048-1600)); ippsMDCTFwd_32f(mdct_in, p_out_spectrum,p_data->p_mdct_fwd_long, p_data->p_buffer_fwd); break; case LONG_STOP_SEQUENCE: ippsZero_32f(mdct_in, 448); ippsMul_32f(&p_in_samples_1st_part[448], prev_window_table_short, &mdct_in[448], 576-448); ippsCopy_32f(&p_in_samples_1st_part[576], &mdct_in[576], 1024-576); ippsMul_32f(p_in_samples_2nd_part, &window_table_long[N_LONG/2], &mdct_in[N_LONG/2], N_LONG/2); ippsMDCTFwd_32f(mdct_in, p_out_spectrum, p_data->p_mdct_fwd_long, p_data->p_buffer_fwd); break; case EIGHT_SHORT_SEQUENCE: if (ltp) { ippsMul_32f(&p_in_samples_1st_part[0], prev_window_table_short, &mdct_in[0], N_SHORT/2); ippsMul_32f(&p_in_samples_1st_part[128], &window_table_short[N_SHORT/2], &mdct_in[N_SHORT/2], N_SHORT/2); ippsMDCTFwd_32f(mdct_in, p_out_spectrum, p_data->p_mdct_fwd_short, p_data->p_buffer_fwd); } else { /// W0 ippsMul_32f(&p_in_samples_1st_part[448], prev_window_table_short, &mdct_in[0], N_SHORT/2); ippsMul_32f(&p_in_samples_1st_part[448+128], &window_table_short[N_SHORT/2], &mdct_in[N_SHORT/2], N_SHORT/2); /// W1 ippsMul_32f(&p_in_samples_1st_part[576], window_table_short, &mdct_in[N_SHORT], N_SHORT); /// W2 ippsMul_32f(&p_in_samples_1st_part[704], window_table_short, &mdct_in[2*N_SHORT], N_SHORT); /// W3 ippsMul_32f(&p_in_samples_1st_part[832], window_table_short, &mdct_in[3*N_SHORT], (3*N_SHORT)/4); ippsMul_32f(p_in_samples_2nd_part, &window_table_short[192], &mdct_in[3*N_SHORT+192], N_SHORT/4); /// W4 ippsMul_32f(&p_in_samples_1st_part[960], window_table_short, &mdct_in[4*N_SHORT], N_SHORT/4); ippsMul_32f(p_in_samples_2nd_part, &window_table_short[64], &mdct_in[4*N_SHORT+64], (3*N_SHORT)/4); /// W5 ippsMul_32f(&p_in_samples_2nd_part[64], window_table_short, &mdct_in[5*N_SHORT], N_SHORT); /// W6 ippsMul_32f(&p_in_samples_2nd_part[64+1*128], window_table_short, &mdct_in[6*N_SHORT], N_SHORT); /// W7 ippsMul_32f(&p_in_samples_2nd_part[64+2*128], window_table_short, &mdct_in[7*N_SHORT], N_SHORT); for (i = 0; i < 8; i ++) { ippsMDCTFwd_32f(&mdct_in[N_SHORT*i], p_out_spectrum+i*(N_SHORT/2), p_data->p_mdct_fwd_short, p_data->p_buffer_fwd); } } break; default: break; }}/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -