mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-08-13 17:38:59 +00:00
Working codec2 support
This commit is contained in:
187
libs/libcodec2/unittest/tcontphase.c
Normal file
187
libs/libcodec2/unittest/tcontphase.c
Normal file
@@ -0,0 +1,187 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
|
||||
FILE........: tcontphase.c
|
||||
AUTHOR......: David Rowe
|
||||
DATE CREATED: 11/9/09
|
||||
|
||||
Test program for developing continuous phase track synthesis algorithm.
|
||||
However while developing this it was discovered that synthesis_mixed()
|
||||
worked just as well.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
Copyright (C) 2009 David Rowe
|
||||
|
||||
All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License version 2, as
|
||||
published by the Free Software Foundation. This program is
|
||||
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#define N 80 /* frame size */
|
||||
#define F 160 /* frames to synthesis */
|
||||
#define P 10 /* LPC order */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "sine.h"
|
||||
#include "dump.h"
|
||||
#include "synth.h"
|
||||
#include "phase.h"
|
||||
|
||||
int frames;
|
||||
|
||||
float ak[] = {
|
||||
1.000000,
|
||||
-1.455836,
|
||||
1.361841,
|
||||
-0.879267,
|
||||
0.915985,
|
||||
-1.002202,
|
||||
0.944103,
|
||||
-0.743094,
|
||||
1.053356,
|
||||
-0.817491,
|
||||
0.431222
|
||||
};
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
|
||||
switch_present()
|
||||
|
||||
Searches the command line arguments for a "switch". If the switch is
|
||||
found, returns the command line argument where it ws found, else returns
|
||||
NULL.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
int switch_present(sw,argc,argv)
|
||||
char sw[]; /* switch in string form */
|
||||
int argc; /* number of command line arguments */
|
||||
char *argv[]; /* array of command line arguments in string form */
|
||||
{
|
||||
int i; /* loop variable */
|
||||
|
||||
for(i=1; i<argc; i++)
|
||||
if (!strcmp(sw,argv[i]))
|
||||
return(i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
|
||||
MAIN
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
int main(argc,argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
FILE *fout;
|
||||
short buf[N];
|
||||
int i,j;
|
||||
int dump;
|
||||
float phi_prev[MAX_AMP];
|
||||
float Wo_prev, ex_phase, G;
|
||||
//float ak[P+1];
|
||||
COMP H[MAX_AMP];
|
||||
float f0;
|
||||
|
||||
if (argc < 3) {
|
||||
printf("\nusage: tcontphase OutputRawSpeechFile F0\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* Output file */
|
||||
|
||||
if ((fout = fopen(argv[1],"wb")) == NULL) {
|
||||
printf("Error opening output speech file: %s\n",argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
f0 = atof(argv[2]);
|
||||
|
||||
dump = switch_present("--dump",argc,argv);
|
||||
if (dump)
|
||||
dump_on(argv[dump+1]);
|
||||
|
||||
init_decoder();
|
||||
|
||||
for(i=0; i<MAX_AMP; i++)
|
||||
phi_prev[i] = 0.0;
|
||||
Wo_prev = 0.0;
|
||||
|
||||
model.Wo = PI*(f0/4000.0);
|
||||
G = 1000.0;
|
||||
model.L = floor(PI/model.Wo);
|
||||
|
||||
//aks_to_H(&model, ak, G , H, P);
|
||||
//for(i=1; i<=model.L; i++)
|
||||
model.A[i] = sqrt(H[i].real*H[i].real + H[i].imag*H[i].imag);
|
||||
//printf("L = %d\n", model.L);
|
||||
//model.L = 10;
|
||||
for(i=1; i<=model.L; i++) {
|
||||
model.A[i] = 1000/model.L;
|
||||
model.phi[i] = 0;
|
||||
H[i].real = 1.0; H[i].imag = 0.0;
|
||||
}
|
||||
|
||||
//ak[0] = 1.0;
|
||||
//for(i=1; i<=P; i++)
|
||||
// ak[i] = 0.0;
|
||||
|
||||
frames = 0;
|
||||
for(j=0; j<F; j++) {
|
||||
frames++;
|
||||
|
||||
#ifdef SWAP
|
||||
/* lets make phases bounce around from frame to frame. This
|
||||
could happen if H[m] is varying, for example due to frame
|
||||
to frame Wo variations, or non-stationary speech.
|
||||
Continous model generally results in smooth phase track
|
||||
under these circumstances. */
|
||||
if (j%2){
|
||||
H[1].real = 1.0; H[1].imag = 0.0;
|
||||
model.phi[1] = 0.0;
|
||||
}
|
||||
else {
|
||||
H[1].real = 0.0; H[1].imag = 1.0;
|
||||
model.phi[1] = PI/2;
|
||||
}
|
||||
#endif
|
||||
|
||||
//#define CONT
|
||||
#ifdef CONT
|
||||
synthesise_continuous_phase(Pn, &model, Sn_, 1, &Wo_prev, phi_prev);
|
||||
#else
|
||||
phase_synth_zero_order(5.0, H, &Wo_prev, &ex_phase);
|
||||
synthesise_mixed(Pn,&model,Sn_,1);
|
||||
#endif
|
||||
|
||||
for(i=0; i<N; i++)
|
||||
buf[i] = Sn_[i];
|
||||
fwrite(buf,sizeof(short),N,fout);
|
||||
}
|
||||
|
||||
fclose(fout);
|
||||
if (dump) dump_off();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user