annotate src/opus-1.3/celt/tests/test_unit_mdct.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 /* Copyright (c) 2008-2011 Xiph.Org Foundation
cannam@154 2 Written by Jean-Marc Valin */
cannam@154 3 /*
cannam@154 4 Redistribution and use in source and binary forms, with or without
cannam@154 5 modification, are permitted provided that the following conditions
cannam@154 6 are met:
cannam@154 7
cannam@154 8 - Redistributions of source code must retain the above copyright
cannam@154 9 notice, this list of conditions and the following disclaimer.
cannam@154 10
cannam@154 11 - Redistributions in binary form must reproduce the above copyright
cannam@154 12 notice, this list of conditions and the following disclaimer in the
cannam@154 13 documentation and/or other materials provided with the distribution.
cannam@154 14
cannam@154 15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cannam@154 16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cannam@154 17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cannam@154 18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
cannam@154 19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
cannam@154 20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
cannam@154 21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
cannam@154 22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
cannam@154 23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
cannam@154 24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
cannam@154 25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cannam@154 26 */
cannam@154 27
cannam@154 28 #ifdef HAVE_CONFIG_H
cannam@154 29 #include "config.h"
cannam@154 30 #endif
cannam@154 31
cannam@154 32 #include <stdio.h>
cannam@154 33
cannam@154 34 #include "mdct.h"
cannam@154 35 #include "stack_alloc.h"
cannam@154 36 #include "kiss_fft.h"
cannam@154 37 #include "mdct.h"
cannam@154 38 #include "modes.h"
cannam@154 39
cannam@154 40 #ifndef M_PI
cannam@154 41 #define M_PI 3.141592653
cannam@154 42 #endif
cannam@154 43
cannam@154 44 int ret = 0;
cannam@154 45 void check(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse)
cannam@154 46 {
cannam@154 47 int bin,k;
cannam@154 48 double errpow=0,sigpow=0;
cannam@154 49 double snr;
cannam@154 50 for (bin=0;bin<nfft/2;++bin) {
cannam@154 51 double ansr = 0;
cannam@154 52 double difr;
cannam@154 53
cannam@154 54 for (k=0;k<nfft;++k) {
cannam@154 55 double phase = 2*M_PI*(k+.5+.25*nfft)*(bin+.5)/nfft;
cannam@154 56 double re = cos(phase);
cannam@154 57
cannam@154 58 re /= nfft/4;
cannam@154 59
cannam@154 60 ansr += in[k] * re;
cannam@154 61 }
cannam@154 62 /*printf ("%f %f\n", ansr, out[bin]);*/
cannam@154 63 difr = ansr - out[bin];
cannam@154 64 errpow += difr*difr;
cannam@154 65 sigpow += ansr*ansr;
cannam@154 66 }
cannam@154 67 snr = 10*log10(sigpow/errpow);
cannam@154 68 printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
cannam@154 69 if (snr<60) {
cannam@154 70 printf( "** poor snr: %f **\n", snr);
cannam@154 71 ret = 1;
cannam@154 72 }
cannam@154 73 }
cannam@154 74
cannam@154 75 void check_inv(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse)
cannam@154 76 {
cannam@154 77 int bin,k;
cannam@154 78 double errpow=0,sigpow=0;
cannam@154 79 double snr;
cannam@154 80 for (bin=0;bin<nfft;++bin) {
cannam@154 81 double ansr = 0;
cannam@154 82 double difr;
cannam@154 83
cannam@154 84 for (k=0;k<nfft/2;++k) {
cannam@154 85 double phase = 2*M_PI*(bin+.5+.25*nfft)*(k+.5)/nfft;
cannam@154 86 double re = cos(phase);
cannam@154 87
cannam@154 88 /*re *= 2;*/
cannam@154 89
cannam@154 90 ansr += in[k] * re;
cannam@154 91 }
cannam@154 92 /*printf ("%f %f\n", ansr, out[bin]);*/
cannam@154 93 difr = ansr - out[bin];
cannam@154 94 errpow += difr*difr;
cannam@154 95 sigpow += ansr*ansr;
cannam@154 96 }
cannam@154 97 snr = 10*log10(sigpow/errpow);
cannam@154 98 printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
cannam@154 99 if (snr<60) {
cannam@154 100 printf( "** poor snr: %f **\n", snr);
cannam@154 101 ret = 1;
cannam@154 102 }
cannam@154 103 }
cannam@154 104
cannam@154 105
cannam@154 106 void test1d(int nfft,int isinverse,int arch)
cannam@154 107 {
cannam@154 108 size_t buflen = sizeof(kiss_fft_scalar)*nfft;
cannam@154 109 kiss_fft_scalar *in;
cannam@154 110 kiss_fft_scalar *in_copy;
cannam@154 111 kiss_fft_scalar *out;
cannam@154 112 opus_val16 *window;
cannam@154 113 int k;
cannam@154 114
cannam@154 115 #ifdef CUSTOM_MODES
cannam@154 116 int shift = 0;
cannam@154 117 const mdct_lookup *cfg;
cannam@154 118 mdct_lookup _cfg;
cannam@154 119 clt_mdct_init(&_cfg, nfft, 0, arch);
cannam@154 120 cfg = &_cfg;
cannam@154 121 #else
cannam@154 122 int shift;
cannam@154 123 const mdct_lookup *cfg;
cannam@154 124 CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
cannam@154 125 if (nfft == 1920) shift = 0;
cannam@154 126 else if (nfft == 960) shift = 1;
cannam@154 127 else if (nfft == 480) shift = 2;
cannam@154 128 else if (nfft == 240) shift = 3;
cannam@154 129 else return;
cannam@154 130 cfg = &mode->mdct;
cannam@154 131 #endif
cannam@154 132
cannam@154 133 in = (kiss_fft_scalar*)malloc(buflen);
cannam@154 134 in_copy = (kiss_fft_scalar*)malloc(buflen);
cannam@154 135 out = (kiss_fft_scalar*)malloc(buflen);
cannam@154 136 window = (opus_val16*)malloc(sizeof(opus_val16)*nfft/2);
cannam@154 137
cannam@154 138 for (k=0;k<nfft;++k) {
cannam@154 139 in[k] = (rand() % 32768) - 16384;
cannam@154 140 }
cannam@154 141
cannam@154 142 for (k=0;k<nfft/2;++k) {
cannam@154 143 window[k] = Q15ONE;
cannam@154 144 }
cannam@154 145 for (k=0;k<nfft;++k) {
cannam@154 146 in[k] *= 32768;
cannam@154 147 }
cannam@154 148
cannam@154 149 if (isinverse)
cannam@154 150 {
cannam@154 151 for (k=0;k<nfft;++k) {
cannam@154 152 in[k] /= nfft;
cannam@154 153 }
cannam@154 154 }
cannam@154 155
cannam@154 156 for (k=0;k<nfft;++k)
cannam@154 157 in_copy[k] = in[k];
cannam@154 158 /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/
cannam@154 159
cannam@154 160 if (isinverse)
cannam@154 161 {
cannam@154 162 for (k=0;k<nfft;++k)
cannam@154 163 out[k] = 0;
cannam@154 164 clt_mdct_backward(cfg,in,out, window, nfft/2, shift, 1, arch);
cannam@154 165 /* apply TDAC because clt_mdct_backward() no longer does that */
cannam@154 166 for (k=0;k<nfft/4;++k)
cannam@154 167 out[nfft-k-1] = out[nfft/2+k];
cannam@154 168 check_inv(in,out,nfft,isinverse);
cannam@154 169 } else {
cannam@154 170 clt_mdct_forward(cfg,in,out,window, nfft/2, shift, 1, arch);
cannam@154 171 check(in_copy,out,nfft,isinverse);
cannam@154 172 }
cannam@154 173 /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
cannam@154 174
cannam@154 175
cannam@154 176 free(in);
cannam@154 177 free(in_copy);
cannam@154 178 free(out);
cannam@154 179 free(window);
cannam@154 180 #ifdef CUSTOM_MODES
cannam@154 181 clt_mdct_clear(&_cfg, arch);
cannam@154 182 #endif
cannam@154 183 }
cannam@154 184
cannam@154 185 int main(int argc,char ** argv)
cannam@154 186 {
cannam@154 187 ALLOC_STACK;
cannam@154 188 int arch = opus_select_arch();
cannam@154 189
cannam@154 190 if (argc>1) {
cannam@154 191 int k;
cannam@154 192 for (k=1;k<argc;++k) {
cannam@154 193 test1d(atoi(argv[k]),0,arch);
cannam@154 194 test1d(atoi(argv[k]),1,arch);
cannam@154 195 }
cannam@154 196 }else{
cannam@154 197 test1d(32,0,arch);
cannam@154 198 test1d(32,1,arch);
cannam@154 199 test1d(256,0,arch);
cannam@154 200 test1d(256,1,arch);
cannam@154 201 test1d(512,0,arch);
cannam@154 202 test1d(512,1,arch);
cannam@154 203 test1d(1024,0,arch);
cannam@154 204 test1d(1024,1,arch);
cannam@154 205 test1d(2048,0,arch);
cannam@154 206 test1d(2048,1,arch);
cannam@154 207 #ifndef RADIX_TWO_ONLY
cannam@154 208 test1d(36,0,arch);
cannam@154 209 test1d(36,1,arch);
cannam@154 210 test1d(40,0,arch);
cannam@154 211 test1d(40,1,arch);
cannam@154 212 test1d(60,0,arch);
cannam@154 213 test1d(60,1,arch);
cannam@154 214 test1d(120,0,arch);
cannam@154 215 test1d(120,1,arch);
cannam@154 216 test1d(240,0,arch);
cannam@154 217 test1d(240,1,arch);
cannam@154 218 test1d(480,0,arch);
cannam@154 219 test1d(480,1,arch);
cannam@154 220 test1d(960,0,arch);
cannam@154 221 test1d(960,1,arch);
cannam@154 222 test1d(1920,0,arch);
cannam@154 223 test1d(1920,1,arch);
cannam@154 224 #endif
cannam@154 225 }
cannam@154 226 return ret;
cannam@154 227 }