⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testresample.c

📁 asterisk 一个模拟IPPBX的源代码
💻 C
字号:
/**********************************************************************  testresample.c  Real-time library interface by Dominic Mazzoni  Based on resample-1.7:    http://www-ccrma.stanford.edu/~jos/resample/  License: LGPL - see the file LICENSE.txt for more information**********************************************************************/#include "../include/libresample.h"#include <stdio.h>#include <stdlib.h>#include <math.h>#define MIN(A, B) (A) < (B)? (A) : (B)void runtest(int srclen, double freq, double factor,             int srcblocksize, int dstblocksize){   int expectedlen = (int)(srclen * factor);   int dstlen = expectedlen + 1000;   float *src = (float *)malloc((srclen+100) * sizeof(float));   float *dst = (float *)malloc((dstlen+100) * sizeof(float));   void *handle;   double sum, sumsq, err, rmserr;   int i, out, o, srcused, errcount, rangecount;   int statlen, srcpos, lendiff;   int fwidth;   printf("-- srclen: %d sin freq: %.1f factor: %.3f srcblk: %d dstblk: %d\n",          srclen, freq, factor, srcblocksize, dstblocksize);   for(i=0; i<srclen; i++)      src[i] = sin(i/freq);   for(i=srclen; i<srclen+100; i++)      src[i] = -99.0;   for(i=0; i<dstlen+100; i++)      dst[i] = -99.0;   handle = resample_open(1, factor, factor);   fwidth = resample_get_filter_width(handle);   out = 0;   srcpos = 0;   for(;;) {      int srcBlock = MIN(srclen-srcpos, srcblocksize);      int lastFlag = (srcBlock == srclen-srcpos);      o = resample_process(handle, factor,                           &src[srcpos], srcBlock,                           lastFlag, &srcused,                           &dst[out], MIN(dstlen-out, dstblocksize));      srcpos += srcused;      if (o >= 0)         out += o;      if (o < 0 || (o == 0 && srcpos == srclen))         break;   }   resample_close(handle);   if (o < 0) {      printf("Error: resample_process returned an error: %d\n", o);   }   if (out <= 0) {      printf("Error: resample_process returned %d samples\n", out);      free(src);      free(dst);      return;   }   lendiff = abs(out - expectedlen);   if (lendiff > (int)(2*factor + 1.0)) {      printf("   Expected ~%d, got %d samples out\n",             expectedlen, out);   }      sum = 0.0;   sumsq = 0.0;   errcount = 0.0;   /* Don't compute statistics on all output values; the last few      are guaranteed to be off because it's based on far less      interpolation. */   statlen = out - fwidth;   for(i=0; i<statlen; i++) {      double diff = sin((i/freq)/factor) - dst[i];      if (fabs(diff) > 0.05) {         if (errcount == 0)            printf("   First error at i=%d: expected %.3f, got %.3f\n",                   i, sin((i/freq)/factor), dst[i]);         errcount++;      }      sum += fabs(diff);      sumsq += diff * diff;   }   rangecount = 0;   for(i=0; i<statlen; i++) {      if (dst[i] < -1.01 || dst[i] > 1.01) {         if (rangecount == 0)            printf("   Error at i=%d: value is %.3f\n", i, dst[i]);         rangecount++;      }   }   if (rangecount > 1)      printf("   At least %d samples were out of range\n", rangecount);   if (errcount > 0) {      i = out - 1;      printf("   i=%d:  expected %.3f, got %.3f\n",             i, sin((i/freq)/factor), dst[i]);      printf("   At least %d samples had significant error.\n", errcount);   }   err = sum / statlen;   rmserr = sqrt(sumsq / statlen);   printf("   Out: %d samples  Avg err: %f RMS err: %f\n", out, err, rmserr);   free(src);   free(dst);}int main(int argc, char **argv){   int i, srclen, dstlen, ifreq;   double factor;   printf("\n*** Vary source block size*** \n\n");   srclen = 10000;   ifreq = 100;   for(i=0; i<20; i++) {      factor = ((rand() % 16) + 1) / 4.0;      dstlen = (int)(srclen * factor + 10);      runtest(srclen, (double)ifreq, factor, 64, dstlen);      runtest(srclen, (double)ifreq, factor, 32, dstlen);      runtest(srclen, (double)ifreq, factor, 8, dstlen);      runtest(srclen, (double)ifreq, factor, 2, dstlen);      runtest(srclen, (double)ifreq, factor, srclen, dstlen);   }   printf("\n*** Vary dest block size ***\n\n");   srclen = 10000;   ifreq = 100;   for(i=0; i<20; i++) {      factor = ((rand() % 16) + 1) / 4.0;      runtest(srclen, (double)ifreq, factor, srclen, 32);      dstlen = (int)(srclen * factor + 10);      runtest(srclen, (double)ifreq, factor, srclen, dstlen);   }   printf("\n*** Resample factor 1.0, testing different srclen ***\n\n");   ifreq = 40;   for(i=0; i<100; i++) {      srclen = (rand() % 30000) + 10;      dstlen = (int)(srclen + 10);      runtest(srclen, (double)ifreq, 1.0, srclen, dstlen);   }   printf("\n*** Resample factor 1.0, testing different sin freq ***\n\n");   srclen = 10000;   for(i=0; i<100; i++) {      ifreq = ((int)rand() % 10000) + 1;      dstlen = (int)(srclen * 10);      runtest(srclen, (double)ifreq, 1.0, srclen, dstlen);   }   printf("\n*** Resample with different factors ***\n\n");   srclen = 10000;   ifreq = 100;   for(i=0; i<100; i++) {      factor = ((rand() % 64) + 1) / 4.0;      dstlen = (int)(srclen * factor + 10);      runtest(srclen, (double)ifreq, factor, srclen, dstlen);   }   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -