123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- /*---------------------------------------------------------------------------*\
-
- 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, see <http://www.gnu.org/licenses/>.
- */
- #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: %s OutputRawSpeechFile F0\n", argv[0]);
- exit(1);
- }
- /* 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;
- }
-
|