www.pudn.com > ica_C.rar > ica_online.c


#include 
#include 
#include 
#include "bss.h"
#include "spec.h"

#ifndef ARRAY
#define ARRAY 1
#include "array.h"
#endif

#ifndef WAV
#define WAV 1
#include "wav_io.h"
#endif

#ifndef MATRIX
#define MATRIX 1
#include "matrix.h"
#endif

#ifndef PERMUTATION
#define PERMUTATION 1
#include "permutation.h"
#endif

#define DIM 2
#define R NFFT

void usage(char *s)
{
  printf("%s -{options}  {-o1 } {-o2 }\n",s);
  printf("  must be *.wav\n\n");
  printf(" options\n");
  printf("   -N       : NFFT, number for FFT,\n");
  printf("                   default=64,    This must be power of 2.\n");
  printf("   -T       : TAU,  number for making filter,\n");
  printf("                   default=NFFT/2,0 < TAU  < NFFT.\n");
  printf("   -S       : Time shift for spectrogram,\n");
  printf("                   default=20,    0 < SHIFT< NFFT.\n");
  printf("   -E      : Learninf ration,\n");
  printf("                   default=0.02.\n");
  printf("   -M      : Time for Moving Average,\n");
  printf("                   default=0.04[s].\n");
  printf("   -P      : Time for Solving Permutation,\n");
  printf("                   default=1.0[s].\n");
  printf("   -h            : print this message.\n\n");
  printf("   -o  : Head part of the output file,\n");
  printf("                   default=, _sep{1,2}.wav\n");
  exit(1);
}
      
int main(int argc, char *argv[])
{
  char infile[1024],outfile[2][1024],
    append1[]="_sep1.wav",append2[]="_sep2.wav";
  int len,slen,i,j,k,l,f,t,FS,data4perm,t_s,ma,NFFT=64,TAU=NULL,
    SHIFT=20;
  SCALAR tmp,ETA=0.02,MA=0.04,T4PERM=1.0;
  wavfmt fmt;
  vector window;
  matrix x,xf_r,xf_i;
  array3 sep_x,Wsep_r,Wsep_i,Winv_r,Winv_i;
  array4 sp_r,sp_i,fil_r,fil_i,fil_t;


  /* options */
  if(argc<2){
    usage(argv[0]);
  }
  i=1;
  while(i NFFT || TAU   < 0) usage(argv[0]);
  if(SHIFT > NFFT || SHIFT < 0) usage(argv[0]);

  if(TAU==NULL)TAU=NFFT/2;

  if(i==argc)usage(argv[0]);
  else if(argc==(i+1)){
    strcpy(infile, argv[i]);
    strncpy(outfile[0], infile, strlen(infile)-4);
    strncpy(outfile[1], infile, strlen(infile)-4);
    outfile[0][strlen(infile)-4]=NULL;
    outfile[1][strlen(infile)-4]=NULL;
    strcat(outfile[0], append1);
    strcat(outfile[1], append2);
  }
  else if(argc>(i+1)){
    strcpy(infile, argv[i]);
    if(strcmp(argv[i+1],"-o")==0){
      strcpy(outfile[0], argv[i+2]);
      strcpy(outfile[1], argv[i+2]);
      outfile[0][strlen(argv[i+2])]=NULL;
      outfile[1][strlen(argv[i+2])]=NULL;
      strcat(outfile[0], append1);
      strcat(outfile[1], append2);
    }
    else usage(argv[0]);
  }

  /* options */

  len=read_wav(infile, &fmt);

  x=new_matrix(DIM,(int)len+NFFT/2);

  WaveData_2_DoubleMat(fmt, x);

  for(t=0;tlen)data4perm=len-(len-NFFT)%((int)SHIFT);
  slen=spl(data4perm, NFFT, SHIFT);
  ma=(int)floor((MA*FS)/((SCALAR)SHIFT));

  /* printf("read data end\n"); */

  window = new_vector(NFFT); hamming(NFFT, window);
  xf_r   = new_matrix(DIM,NFFT);
  xf_i   = new_matrix(DIM,NFFT);
  sep_x  = new_array3(DIM,DIM,len);
  Wsep_r = new_array3(NFFT/2+1,DIM,DIM);
  Wsep_i = new_array3(NFFT/2+1,DIM,DIM);
  Winv_r = new_array3(NFFT/2+1,DIM,DIM);
  Winv_i = new_array3(NFFT/2+1,DIM,DIM);
  for(f=0;f0 && (t*10)%((int)FS)==0){printf(".");fflush(stdout);}
    if(t>0 && t%((int)FS)==0)printf("\n");

    for(i=0;idata4perm && ((t-data4perm)*10)%((int)FS)==0){
      printf(".");fflush(stdout);
    }
    if(t>data4perm && (t-data4perm)%((int)FS)==0)printf("\n");

    for(j=0;j