/***************************************************************************************/ /* */ /* Program Name : MDCT & HUFFMAN AUDIO CODEC */ /* */ /* Date : 2022.03.15 New Create */ /* */ /* Author : Takashi Nakajima */ /* */ /* Function : 44.1kHz Signed 16bit STEREO WAV AUDIO COMPRESSION */ /* */ /* ver01 2022.03.15 New Create */ /* */ /***************************************************************************************/ #include #include #include #include #include #include #define uchar unsigned char #define ushort unsigned short #define uint unsigned int #define ulong unsigned long #define rchar register char #define rshort register short #define rint register int #define rlong register long #define ruchar register uchar #define rushort register ushort #define ruint register uint #define rulong register ulong #define schar static char #define sshhort static short #define sint static int #define slong static long #define suchar static uchar #define sushort static ushort #define suint static uint #define sulong static ulong #define ORG_IMAGE_X 720 #define ORG_IMAGE_Y 480 #define BUNBOMAX 32 #define BUNSHIMAX 31 #define TAPMAXY 50 #define TAPMAXC 50 typedef struct control_data { uint sizex; uint sizey; uint startx; uint starty; char InputFileName[128]; char InputFileName2[128]; char OutputFileName[128]; uint hv; uint sm; uint smy; uint bunshi; uint bunbo; uint norm; uint mado; uint tapnum_y; uint tapnum_c; int p; int ol; int af; double Fs; double angle; } CNTL; char inputfile[50]; char inputfile2[50]; char outputfile[50]; int hsize; int vsize; int org_image_x; int org_image_y; void coeffhairetsuculc(uint , uint, uint , uint, uint, uint, uint, uint, double, double, double, double, double *,double *, uint,double); double INITPHASECULC(uint , uint , uint , uint , uint ); uint FILPATCULC(uint , uint , uint , double , double *); void COEFCULC( uint , uint , uint , uint , uint , uint , uint, double ); void normarize(uint ,uint ,uint ,uint , double *, uint ); void DFT1DV(int , double *, double *, double *, double *); void DFT1DH(int , int , double *, double*, double *, double *); void IDFT1DV(int , double *, double *, double *, double *); void IDFT1DH(int , int , double *, double*, double *, double *); void resize( int hsize, int vsize, int sizeminus, int smy, unsigned char *vin_buffer , unsigned char *vout); void print_help( void ) { fprintf( stderr, "Usage: ARBITRARY ROTATION BMP [options]\n" ); fprintf( stderr, "\toptions: \n" ); fprintf( stderr, "\t -help : help\n" ); fprintf( stderr, "\t -i : input wav filename(44.1kHzSTEREO16bitLinearPCMonly)\n" ); fprintf( stderr, "\t -o : output wav filename(44.1kHzSTEREO16bitLinearPCMonly auto add .wav extension\n" ); fprintf( stderr, "\t -p : MDCT sample number\n" ); // fprintf( stderr, "\t -ol : overlap num(2 no baisuu only) \n" ); // fprintf( stderr, "\t -af : 0:seigenha kasan housiki 1:IFFT housiki\n" ); // fprintf( stderr, "\t -angle : angle 0OutputFileName, argv[++i]); } else if ( !strcmp( &argv[i][1], "i" ) ){ strcpy(ptr->InputFileName, argv[++i]); } else if ( !strcmp( &argv[i][1], "i2" ) ){ strcpy(ptr->InputFileName2, argv[++i]); } else if ( !strcmp( &argv[i][1], "x" ) ){ ptr->sizex = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "y" ) ){ ptr->sizey = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "startx" ) ){ ptr->startx = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "starty" ) ){ ptr->starty = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "hv" ) ){ ptr->hv = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "bunshi" ) ){ ptr->bunshi = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "bunbo" ) ){ ptr->bunbo = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "norm" ) ){ ptr->norm = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "mado" ) ){ ptr->mado = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "tapnum_y" ) ){ ptr->tapnum_y = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "af" ) ){ ptr->af = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "tapnum_c" ) ){ ptr->tapnum_c = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "Fsc" ) ){ ptr->Fs = atof(argv[++i]); } else if ( !strcmp( &argv[i][1], "angle" ) ){ ptr->angle = atof(argv[++i]); } else if ( !strcmp( &argv[i][1], "sizexminus" ) ){ ptr->sm = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "sizexminusy" ) ){ ptr->smy = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "p" ) ){ ptr->p = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "ol" ) ){ ptr->ol = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "orgx" ) ){ /* \277\345\312\277\312\375\270\376\306\376\316\317\262\350\301\374\245\265\245\244\245\272 */ org_image_x = atoi(argv[++i]); } else if ( !strcmp( &argv[i][1], "orgy" ) ){ /* \277\342\304\276\312\375\270\376\306\376\316\317\262\350\301\374\245\265\245\244\245\272 */ org_image_y = atoi(argv[++i]); } else { print_help(); exit(0); } } } FILE *infile, *outfile; /* 入力ファイル, 出力ファイル */ unsigned long outcount = 0; /* 出力バイト数カウンタ */ static int getcount = 0, putcount = 8; /* ビット入出力カウンタ */ static unsigned bitbuf = 0; /* ビット入出力バッファ */ #define rightbits(n, x) ((x) & ((1U << (n)) - 1U)) /* xの右nビット */ void error(char *message) /* メッセージを表示し終了 */ { fprintf(stderr, "\n%s\n", message); exit(EXIT_FAILURE); } unsigned getbit(void) /* 1ビット読む */ { if (--getcount >= 0) return (bitbuf >> getcount) & 1U; getcount = 7; bitbuf = getc(infile); return (bitbuf >> 7) & 1U; } unsigned getbits(int n) /* nビット読む */ { unsigned x; x = 0; while (n > getcount) { n -= getcount; x |= rightbits(getcount, bitbuf) << n; bitbuf = getc(infile); getcount = 8; } getcount -= n; return x | rightbits(n, bitbuf >> getcount); } void putbit(unsigned bit) /* 1ビット書き出す */ { putcount--; if (bit != 0) bitbuf |= (1 << putcount); if (putcount == 0) { if (putc(bitbuf, outfile) == EOF) error("cant write"); bitbuf = 0; putcount = 8; outcount++; } } void putbits(int n, unsigned x) /* nビット書き出す */ { while (n >= putcount) { n -= putcount; bitbuf |= rightbits(putcount, x >> n); if (putc(bitbuf, outfile) == EOF) error("cant write"); bitbuf = 0U; putcount = 8; outcount++; } putcount -= n; bitbuf |= rightbits(n, x) << putcount; } #define N 256 /* 文字の種類 */ #define CHARBITS 8 /* 1バイトのビット数 */ int heapsize, heap[2*N-1], /* 優先待ち行列用ヒープ */ parent[2*N-1], left[2*N-1], right[2*N-1]; /* Huffman木 */ unsigned long int freq[2*N-1]; /* 各文字の出現頻度 */ static void downheap(int i) /* 優先待ち行列に挿入 */ { int j, k; k = heap[i]; while ((j = 2 * i) <= heapsize) { if (j < heapsize && freq[heap[j]] > freq[heap[j + 1]]) j++; if (freq[k] <= freq[heap[j]]) break; heap[i] = heap[j]; i = j; } heap[i] = k; } void writetree(int i) /* 枝を出力 */ { if (i < N) { /* 葉 */ putbit(0); putbits(CHARBITS, i); /* 文字そのもの */ } else { /* 節 */ putbit(1); writetree(left[i]); writetree(right[i]); /* 左右の枝 */ } } void encode(void) /* 圧縮 */ { int i, j, k, avail, tablesize; unsigned long int incount, cr; static char codebit[N]; /* 符号語 */ for (i = 0; i < N; i++) freq[i] = 0; /* 頻度の初期化 */ while ((i = getc(infile)) != EOF) freq[i]++; /* 頻度数え */ heap[1] = 0; /* 長さ0のファイルに備える */ heapsize = 0; for (i = 0; i < N; i++) if (freq[i] != 0) heap[++heapsize] = i; /* 優先待ち行列に登録 */ for (i = heapsize / 2; i >= 1; i--) downheap(i); /* ヒープ作り */ for (i = 0; i < 2 * N - 1; i++) parent[i] = 0; /* 念のため */ k = heap[1]; /* 以下のループが1回も実行されない場合に備える */ avail = N; /* 以下のループでハフマン木を作る */ while (heapsize > 1) { /* 2個以上残りがある間 */ i = heap[1]; /* 最小の要素を取り出す */ heap[1] = heap[heapsize--]; downheap(1); /* ヒープ再構成 */ j = heap[1]; /* 次に最小の要素を取り出す */ k = avail++; /* 新しい節を生成する */ freq[k] = freq[i] + freq[j]; /* 頻度を合計 */ heap[1] = k; downheap(1); /* 待ち行列に登録 */ parent[i] = k; parent[j] = -k; /* 木を作る */ left[k] = i; right[k] = j; /* 〃 */ } writetree(k); /* 木を出力 */ tablesize = (int) outcount; /* 表の大きさ */ incount = 0; rewind(infile); /* 再走査 */ while ((j = getc(infile)) != EOF) { k = 0; while ((j = parent[j]) != 0) if (j > 0) codebit[k++] = 0; else { codebit[k++] = 1; j = -j; } while (--k >= 0) putbit(codebit[k]); if ((++incount & 1023) == 0) printf("%12lu\r", incount); /* 状況報告 */ } putbits(7, 0); /* バッファの残りをフラッシュ */ printf("In : %lu bytes\n", incount); /* 結果報告 */ printf("Out: %lu bytes (table: %d bytes)\n", outcount, tablesize); if (incount != 0) { /* 圧縮比を求めて報告 */ cr = (1000 * outcount + incount / 2) / incount; printf("Out/In: %lu.%03lu\n", cr / 1000, cr % 1000); } } int readtree(void) /* 木を読む */ { int i; static int avail = N; if (getbit()) { /* bit=1: 葉でない節 */ if ((i = avail++) >= 2 * N - 1) error("fugouhyoumatigatteru!!"); left [i] = readtree(); /* 左の枝を読む */ right[i] = readtree(); /* 右の枝を読む */ return i; /* 節を返す */ } else return (int) getbits(CHARBITS); /* 文字 */ } void decode(unsigned long int size) /* 復元 */ { int j, root; unsigned long int k; root = readtree(); /* 木を読む */ for (k = 0; k < size; k++) { /* 各文字を復元 */ j = root; /* 根 */ while (j >= N) if (getbit()) j = right[j]; else j = left[j]; putc(j, outfile); if ((k & 1023) == 0) printf("%12lu\r", k); /* 出力バイト数 */ } printf("%12lu\n", size); /* 復元したバイト数 */ } int huffman(int argc2, char *argv2[]) { int c; unsigned long int size; /* 元のバイト数 */ if (argc2 != 4 || ((c = *argv2[1]) != 'E' && c != 'e' && c != 'D' && c != 'd')) error("usage uncorrect"); if ((infile = fopen(argv2[2], "rb")) == NULL) error("input file cant open"); if ((outfile = fopen(argv2[3], "wb")) == NULL) error("output file cant open"); if (c == 'E' || c == 'e') { fseek(infile, 0L, SEEK_END); /* infile の末尾を探す */ size = ftell(infile); /* infile のバイト数 */ fwrite(&size, sizeof size, 1, outfile); rewind(infile); encode(); /* 圧縮 */ } else { fread(&size, sizeof size, 1, infile); /* 元のバイト数 */ decode(size); /* 復元 */ } fclose(infile); fclose(outfile); return EXIT_SUCCESS; } void fft(double *real,double *imag, int power, int flg) { double c,s,t1,t2; int arg,inc,i,j,k,lmax,lix,j1,j2,pnum,pnum1,nv2; pnum = (int)(pow(2.0,(float)(power))+0.5); double PI = atan(1.0) * 4.0; lmax = pnum; inc = 1; for(i=0;i=0 && j <= 20){ // printf("%f\n",KEISUU[j+i*WINDOWSIZE/2]); // } }//while(1); } return 0; } int ichannel( double *KEISUU, int NUM,int *DIST, int WINDOWSIZE,int FILESIZE){ int i,j,k; double *DISTDBL,*BUFFER,PI,*SSS; PI = 4.0*atan(1.0); BUFFER = (double*)malloc(sizeof(double)*WINDOWSIZE/2); SSS = (double*)malloc(sizeof(double)*WINDOWSIZE); DISTDBL = (double*)malloc(sizeof(double)*FILESIZE); for(i=0;i= 0.0){ DIST[i] = (int)(DISTDBL[i] + 0.5); } else { DIST[i] = (int)(DISTDBL[i] - 0.5); } } return 0; } int main(int argc, char *argv[]){ FILE *fpr1; FILE *fpr2; FILE *fpw5; unsigned char *vin; unsigned char *vout; unsigned char *vin_buffer; //#define HSIZE 360 //#define VSIZE 288 //#define tmp HSIZE*VSIZE int i,j,k,l,m,n,o ; CNTL *cnt; int center0; int sizeminus; int filesizebyte; int filesizebyte2; unsigned char *B; unsigned char *G; unsigned char *R; unsigned char *BIN; unsigned char *GIN; unsigned char *RIN; unsigned char *RUPOUT; unsigned char *GUPOUT; unsigned char *BUPOUT; unsigned char temp; unsigned char temp2; unsigned int filesize; double DiagonalLength; int NewHsize; int NewVsize; double PI; double *rotx; double *roty; double *screen_rotx; double *screen_roty; int *introtx; int *introty; double aaa; double bbb; int ww; int xx; int yy; int zz; double low_x; double up_x; int wwg; int xxg; int yyg; int zzg; double low_xg; double up_xg; int wwr; int xxr; int yyr; int zzr; double low_xr; double up_xr; double ccc; double ddd; org_image_x = ORG_IMAGE_X; org_image_y = ORG_IMAGE_Y; if( argc < 2 ) { print_help(); exit(0); } //-----debug----- //for(;;); //---------------- cnt = (CNTL *)malloc( sizeof(CNTL)*sizeof(uchar) ); /* \245\307\245\325\245\251\245\353\245\310\303\315\300\337\304\352 */ cnt->sizex = ORG_IMAGE_X; cnt->sizey = ORG_IMAGE_Y; cnt->startx = 0; cnt->starty = 0; /* \245\252\245\327\245\267\245\347\245\363\245\301\245\247\245\303\245\257 */ cnt->p = 2048; //option_set(argc, argv, cnt); hsize = org_image_x; vsize = org_image_y; //strcpy(inputfile,cnt->InputFileName); //strcpy(inputfile2,cnt->InputFileName2); //strcpy(outputfile,cnt->OutputFileName); sizeminus = cnt->sm; int argc2; char **argv2; argv2 = (char**)malloc(sizeof(char*)*6); for(i=0;i<6;i++){ argv2[i] = (char*)malloc(sizeof(char)*80); } /********************************/ /* */ /* MAIN ROUTINE */ /* */ /********************************/ int karikari; unsigned char karikari2,karikari3; // vin_buffer = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); // vout = (unsigned char *)malloc(sizeof(unsigned char)*(hsize+sizeminus)*(vsize+smy)*2); if(argc != 4){ exit(0);}; if(argv[1][0] == 'e' || argv[1][0] == 'E'){;} else if(argv[1][0] == 'd' || argv[1][0] == 'D'){goto decode_start;} if((fpr1 = fopen(argv[2],"rb"))==NULL){ exit(0); } //debug start //for(;;); //debug end /***************************************************/ /* picture size & file size get from bitmap header */ /***************************************************/ fread(&filesizebyte,sizeof(int),1,fpr1); if(filesizebyte == 0x46464952){ fprintf(stderr,"RIFFdayoOK\n"); } else { fprintf(stderr,"RIFFjyanaiyo!!\n"); fclose(fpr1); exit(0); } // fseek(fpr1,18,SEEK_SET); // fread(&hsize,sizeof(int),1,fpr1); fseek(fpr1,0x8,SEEK_SET); fread(&filesizebyte,sizeof(int),1,fpr1); fread(&filesizebyte2,sizeof(int),1,fpr1); if(filesizebyte == 0x45564157 && filesizebyte2 == 0x20746D66){ fprintf(stderr,"WAVEfmt dayoOK\n"); } else { fprintf(stderr,"WAVEfmt jyanaiyo!!\n"); fclose(fpr1); exit(0); } fseek(fpr1,0x14,SEEK_SET); fread(&filesizebyte,sizeof(int),1,fpr1); // fread(&filesizebyte2,sizeof(int),1,fpr1); if(filesizebyte == 0x020001 ){ fprintf(stderr,"LINEAR PCM STEREO dayoOK\n"); } else if(filesizebyte == 0x010001 ){ fprintf(stderr,"LINEAR PCM MONO dayoOK\n"); } else { fclose(fpr1); exit(0); } fread(&filesizebyte,sizeof(int),1,fpr1); if(filesizebyte == 0xAC44 ){//44.1kHz fprintf(stderr,"SampleRate 44.1kHz dayoOK\n"); } else if(filesizebyte == 0xAC44/2){ fprintf(stderr,"SampleRate 22.05kHz dayoOK\n"); } else { fclose(fpr1); exit(0); } fread(&filesizebyte2,sizeof(int),1,fpr1); // fread(&filesizebyte2,sizeof(int),1,fpr1); if(filesizebyte2 == 176400 && filesizebyte == 0xAC44){ fprintf(stderr,"16bit dayo!!OK\n"); } else if(filesizebyte2 == 176400/2 && filesizebyte == 0xAC44){ fprintf(stderr,"16bit dayo!!OK\n"); } else if(filesizebyte == 0xAC44/2 && filesizebyte2 == 0xAC44/2*2*2){ fprintf(stderr,"16bit dayo!!OK\n"); } else if(filesizebyte == 0xAC44/2 && filesizebyte2 == 0xAC44/2*2){ fprintf(stderr,"16bit dayo!!OK\n"); fclose(fpr1); exit(0); } // fread(&vsize,sizeof(int),1,fpr1); // fseek(fpr1,2,SEEK_SET); // fread(&filesizebyte,sizeof(int),1,fpr1); //debug start //printf ("%d\n",filesizebyte); //for(;;); //debug end /***************/ /* picture get */ /***************/ // vin = (unsigned char *)malloc(sizeof(unsigned char)*(filesizebyte-54)); B = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); G = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); R = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); fseek(fpr1,0x28,SEEK_SET); fread(&filesizebyte,sizeof(int),1,fpr1); // for(i=0;i=32768){ *(LEFT+i) = -(32768*2-(*(LEFT+i))); } if(*(RIGHT+i)>=32768){ *(RIGHT+i) = -(32768*2-(*(RIGHT+i))); } //tyuui // *(LEFT+i) +=32768; // *(RIGHT+i) +=32768; } int *SAISYOL,*SAISYOR,*SAIGOL,*SAIGOR,SAIGONUM; SAIGONUM = cnt->p / 2 + ((filesizebyte/4) % cnt->p); SAISYOL = (int*)malloc(sizeof(int)* cnt->p / 2); SAISYOR = (int*)malloc(sizeof(int)* cnt->p / 2); SAIGOR = (int*)malloc(sizeof(int)* SAIGONUM); SAIGOL = (int*)malloc(sizeof(int)* SAIGONUM); for(i=0;i < cnt->p / 2;i++){ SAISYOL[i] = LEFT[i]; SAISYOR[i] = RIGHT[i]; } for(i=0;ip,&KNUM); channel( RIGHT, filesizebyte/4, KEISUUR, cnt->p,&KNUM); // 4byte kata channel sample suu // 2048 byte atama R data 1024 sample // 2048 byte atama L data 1024 sample // (filesizebyte/4 % 2048 + 1024) * 2 byte tail R data (filesizebyte/4 % 2048 + 1024)sample // (filesizebyte/4 % 2048 + 1024) * 2 byte tail L data (filesizebyte/4 % 2048 + 1024)sample // (filesizebyte/4/2048 * 2 - 1)*1024*2 byte KEISUU R // (filesizebyte/4/2048 * 2 - 1)*1024*2 byte KEISUU L FILE *fpw6; // int karikari; // unsigned char karikari2,karikari3; fpw6 = fopen("xxx.bit","wb"); fwrite(&FILESIZE,sizeof(int),1,fpw6); for(i=0;ip/2;i++){ karikari = SAISYOR[i]; if(karikari < 0){ karikari += 32768*2; } karikari2 = (unsigned char)(karikari & 0xff);//lower karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper fwrite(&karikari2,sizeof(unsigned char),1,fpw6); fwrite(&karikari3,sizeof(unsigned char),1,fpw6); } for(i=0;ip/2;i++){ karikari = SAISYOL[i]; if(karikari < 0){ karikari += 32768*2; } karikari2 = (unsigned char)(karikari & 0xff);//lower karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper fwrite(&karikari2,sizeof(unsigned char),1,fpw6); fwrite(&karikari3,sizeof(unsigned char),1,fpw6); } for(i=0;i> 8) & 0xff);//upper fwrite(&karikari2,sizeof(unsigned char),1,fpw6); fwrite(&karikari3,sizeof(unsigned char),1,fpw6); } for(i=0;i> 8) & 0xff);//upper fwrite(&karikari2,sizeof(unsigned char),1,fpw6); fwrite(&karikari3,sizeof(unsigned char),1,fpw6); } for(i=0;ip/2;i++){ karikari = (int)(KEISUUR[i]+0.5); if(karikari < 0){ karikari += 32768*2; } karikari2 = (unsigned char)(karikari & 0xff);//lower karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper fwrite(&karikari2,sizeof(unsigned char),1,fpw6); fwrite(&karikari3,sizeof(unsigned char),1,fpw6); } for(i=0;ip/2;i++){ karikari = (int)(KEISUUL[i]+0.5); if(karikari < 0){ karikari += 32768*2; } karikari2 = (unsigned char)(karikari & 0xff);//lower karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper fwrite(&karikari2,sizeof(unsigned char),1,fpw6); fwrite(&karikari3,sizeof(unsigned char),1,fpw6); } fclose(fpw6); argc2 = 4; argv2[1][0] = 'e'; argv2[2][0]='x'; argv2[2][1]='x'; argv2[2][2]='x'; argv2[2][3]='.'; argv2[2][4]='b'; argv2[2][5]='i'; argv2[2][6]='t'; argv2[2][7]='\0'; // argv2[3][0]='y'; // argv2[3][1]='y'; // argv2[3][2]='y'; // argv2[3][3]='.'; // argv2[3][4]='b'; // argv2[3][5]='i'; // argv2[3][6]='t'; // argv2[3][7]='\0'; strcpy(argv2[3],argv[3]); huffman(argc2,argv2); if(argv[1][0] == 'e' || argv[1][0] == 'E') {goto encode_end;} decode_start: argc2 = 4; argv2[1][0] = 'd'; // argv2[2][0]='y'; // argv2[2][1]='y'; // argv2[2][2]='y'; // argv2[2][3]='.'; // argv2[2][4]='b'; // argv2[2][5]='i'; // argv2[2][6]='t'; // argv2[2][7]='\0'; strcpy(argv2[2],argv[2]); argv2[3][0]='z'; argv2[3][1]='z'; argv2[3][2]='z'; argv2[3][3]='.'; argv2[3][4]='b'; argv2[3][5]='i'; argv2[3][6]='t'; argv2[3][7]='\0'; huffman(argc2,argv2); cnt->p = 2048; FILE *fpr3; fpr3 = fopen("zzz.bit","rb"); fread(&karikari,sizeof(int),1,fpr3); printf("FILESIZE = %d\n",karikari); FILESIZE = karikari; //printf("FILESIZE2=%d\n",FILESIZE); SAIGONUM = cnt->p / 2 + ((FILESIZE) % cnt->p); int *SAISYOL2,*SAISYOR2,*SAIGOR2,*SAIGOL2,*DISTL2,*DISTR2; double *KEISUUR2,*KEISUUL2; SAISYOL2 = (int*)malloc(sizeof(int)* cnt->p / 2); SAISYOR2 = (int*)malloc(sizeof(int)* cnt->p / 2); SAIGOR2 = (int*)malloc(sizeof(int)* SAIGONUM); SAIGOL2 = (int*)malloc(sizeof(int)* SAIGONUM); KEISUUR2 = (double*)malloc(sizeof(double)*FILESIZE); KEISUUL2 = (double*)malloc(sizeof(double)*FILESIZE); DISTL2 = (int*)malloc(sizeof(int)*FILESIZE); DISTR2 = (int*)malloc(sizeof(int)*FILESIZE); // for(i=0;ip + SAIGONUM * 2;i++){ // fread(&karikari2,sizeof(unsigned char),1,fpr3); // fread(&karikari2,sizeof(unsigned char),1,fpr3); // } for(i=0;ip / 2;i++){ fread(&karikari2,sizeof(unsigned char),1,fpr3); fread(&karikari3,sizeof(unsigned char),1,fpr3); SAISYOR2[i] = karikari3*256+karikari2; if(SAISYOR2[i] >=32768){ SAISYOR2[i] = -(32768*2-SAISYOR2[i]); } } for(i=0;ip / 2;i++){ fread(&karikari2,sizeof(unsigned char),1,fpr3); fread(&karikari3,sizeof(unsigned char),1,fpr3); SAISYOL2[i] = karikari3*256+karikari2; if(SAISYOL2[i] >=32768){ SAISYOL2[i] = -(32768*2-SAISYOL2[i]); } } for(i=0;i=32768){ SAIGOR2[i] = -(32768*2-SAIGOR2[i]); } } for(i=0;i=32768){ SAIGOL2[i] = -(32768*2-SAIGOL2[i]); } } // KAISUU = NUM / WINDOWSIZE * 2 - 1; KNUM = FILESIZE / cnt->p * 2 -1; for(i=0;ip/2;i++){ fread(&karikari2,sizeof(unsigned char),1,fpr3); fread(&karikari3,sizeof(unsigned char),1,fpr3); KEISUUR2[i] = karikari3*256+karikari2; if(KEISUUR2[i] >=32768){ KEISUUR2[i] = -(32768*2-KEISUUR2[i]); } } for(i=0;ip/2;i++){ fread(&karikari2,sizeof(unsigned char),1,fpr3); fread(&karikari3,sizeof(unsigned char),1,fpr3); KEISUUL2[i] = karikari3*256+karikari2; if(KEISUUL2[i] >=32768){ KEISUUL2[i] = -(32768*2-KEISUUL2[i]); } } fclose(fpr3); //while(1); ichannel(KEISUUL2,KNUM,DISTL2,cnt->p,FILESIZE); ichannel(KEISUUR2,KNUM,DISTR2,cnt->p,FILESIZE); //while(1); // for(i=0;ip / 2;i++){ DISTR2[i] = SAISYOR2[i]; DISTL2[i] = SAISYOL2[i]; }//while(1); for(i=0;ip*cnt->p - cnt->p/2+i] = SAIGOR2[i]; DISTL2[(FILESIZE)/cnt->p*cnt->p - cnt->p/2+i] = SAIGOL2[i]; } //while(1); //printf("tootta\n"); int *LEFTINT; int FSIZE; FSIZE = FILESIZE; printf("FSIZE=%d\n",FILESIZE); LEFTINT = (int*)malloc(sizeof(int)*(FSIZE)); for(i=0;i= 0.0){ // *(LEFTINT+i)=(int)((*(LEFTSAMPLE+i)/*-32768.0*/)+0.5); // } // if((*(LEFTSAMPLE+i)/*-32768.0*/) < 0.0){ // *(LEFTINT+i)=(int)((*(LEFTSAMPLE+i)/*-32768.0*/)-0.5); // } LEFTINT[i] = DISTL2[i]; if(*(LEFTINT+i) > 32767){ //fprintf(stderr,"%d\n",*(LEFTINT+i)); *(LEFTINT+i) = 32767; } if(*(LEFTINT+i) < -32768){ //fprintf(stderr,"%d\n",*(LEFTINT+i)); *(LEFTINT+i) = -32768; } //fprintf(stderr,"%d\n",*(LEFTINT+i)); } int *RIGHTINT; RIGHTINT = (int*)malloc(sizeof(int)*(FSIZE)); for(i=0;i= 0.0){ // *(RIGHTINT+i)=(int)((*(RIGHTSAMPLE+i)/*-32768.0*/)+0.5); // } // if((*(RIGHTSAMPLE+i)/*-32768.0*/) < 0.0){ // *(RIGHTINT+i)=(int)((*(RIGHTSAMPLE+i)/*-32768.0*/)-0.5); // } RIGHTINT[i] = DISTR2[i]; if(*(RIGHTINT+i) > 32767){ *(RIGHTINT+i) = 32767; } if(*(RIGHTINT+i) < -32768){ *(RIGHTINT+i) = -32768; } } //LEFTINTとRIGHTINTにfilesizeyte/2-1個の-32768〜32767のデータを16bit 2の補数に直す。以下8行 for(i=0;i=0){ *(MONO+i)= (int)(((((float)(*(RIGHT+i))) + ((float)(*(LEFT+i))))/2.0)+0.5); } if(*(RIGHT+i)+ *(LEFT+i) < 0){ *(MONO+i)= (int)(((((float)(*(RIGHT+i))) + ((float)(*(LEFT+i))))/2.0)-0.5); } if(*(MONO+i) < 0){ *(MONO+i) = 32768*2+(*(MONO+i)); } // *(MONO+i) += 32768; } */ // int FFFFFFF; // FFFFFFF=(int)(-15.3); // fprintf(stderr,"%d\n",FFFFFFF); // while(1); // fprintf(stderr,"%x\n",((0x0000FF00 & 0x1234)>>8)); // while(1); RUPOUT = (unsigned char *)malloc(sizeof(unsigned char)*(hsize)*(vsize)); GUPOUT = (unsigned char *)malloc(sizeof(unsigned char)*(hsize)*(vsize)); BUPOUT = (unsigned char *)malloc(sizeof(unsigned char)*(hsize)*(vsize)); // hsize = NewHsize; // vsize = NewVsize; strcpy(outputfile,argv[3]); sprintf(cnt->OutputFileName,"%s.wav",outputfile); fpw5 = fopen(cnt->OutputFileName,"wb"); /************************/ /* HEADER 54 byte write */ /************************/ // if(((hsize*3)%4) == 0){ // filesize = 0x36 + hsize*vsize*3; // } else { // filesize = 0x36 + hsize*vsize*3+(4-(hsize*3)%4)*vsize; // } //debug start // while(1); //debug end filesize = 0x46464952; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize = (unsigned int)(FSIZE*4+0x24); fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =0x45564157; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =0x20746D66; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =0x10; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =0x00020001; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =0xAC44; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =176400; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =0x100004; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =0x61746164; fwrite(&filesize,sizeof(unsigned int),1,fpw5); filesize =FSIZE*4; fwrite(&filesize,sizeof(unsigned int),1,fpw5); for(i=0;i>8); fwrite(&RD,sizeof(unsigned char),1,fpw5); fwrite(&RU,sizeof(unsigned char),1,fpw5); RD = 0x000000FF & *(RIGHTINT+i); RU = ((0x0000FF00 & *(RIGHTINT+i))>>8); fwrite(&RD,sizeof(unsigned char),1,fpw5); fwrite(&RU,sizeof(unsigned char),1,fpw5); } /* temp = 0x42; //'B' fwrite(&temp,sizeof(unsigned char),1,fpw); temp = 0x4D; //'M' fwrite(&temp,sizeof(unsigned char),1,fpw); fwrite(&filesize,sizeof(unsigned int),1,fpw); filesize = 0; fwrite(&filesize,sizeof(unsigned int),1,fpw); filesize = 0x00000036; fwrite(&filesize,sizeof(unsigned int),1,fpw); filesize = 0x28; fwrite(&filesize,sizeof(unsigned int),1,fpw); fwrite(&hsize,sizeof(int),1,fpw); fwrite(&vsize,sizeof(int),1,fpw); filesize = 0x00180001; fwrite(&filesize,sizeof(unsigned int),1,fpw); filesize = 0; fwrite(&filesize,sizeof(unsigned int),1,fpw); fwrite(&filesize,sizeof(unsigned int),1,fpw); filesize = 0x00000EC4; fwrite(&filesize,sizeof(unsigned int),1,fpw); fwrite(&filesize,sizeof(unsigned int),1,fpw); filesize = 0; fwrite(&filesize,sizeof(unsigned int),1,fpw); fwrite(&filesize,sizeof(unsigned int),1,fpw); temp2 =0; for(i=0;i