annotate constant-q-cpp/src/ext/kissfft/tools/fftutil.c @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents 5d0a2ebb4d17
children
rev   line source
Chris@366 1 /*
Chris@366 2 Copyright (c) 2003-2004, Mark Borgerding
Chris@366 3
Chris@366 4 All rights reserved.
Chris@366 5
Chris@366 6 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Chris@366 7
Chris@366 8 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Chris@366 9 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Chris@366 10 * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
Chris@366 11
Chris@366 12 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Chris@366 13 */
Chris@366 14
Chris@366 15 #include <stdlib.h>
Chris@366 16 #include <math.h>
Chris@366 17 #include <stdio.h>
Chris@366 18 #include <string.h>
Chris@366 19 #include <unistd.h>
Chris@366 20
Chris@366 21 #include "kiss_fft.h"
Chris@366 22 #include "kiss_fftndr.h"
Chris@366 23
Chris@366 24 static
Chris@366 25 void fft_file(FILE * fin,FILE * fout,int nfft,int isinverse)
Chris@366 26 {
Chris@366 27 kiss_fft_cfg st;
Chris@366 28 kiss_fft_cpx * buf;
Chris@366 29 kiss_fft_cpx * bufout;
Chris@366 30
Chris@366 31 buf = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * nfft );
Chris@366 32 bufout = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * nfft );
Chris@366 33 st = kiss_fft_alloc( nfft ,isinverse ,0,0);
Chris@366 34
Chris@366 35 while ( fread( buf , sizeof(kiss_fft_cpx) * nfft ,1, fin ) > 0 ) {
Chris@366 36 kiss_fft( st , buf ,bufout);
Chris@366 37 fwrite( bufout , sizeof(kiss_fft_cpx) , nfft , fout );
Chris@366 38 }
Chris@366 39 free(st);
Chris@366 40 free(buf);
Chris@366 41 free(bufout);
Chris@366 42 }
Chris@366 43
Chris@366 44 static
Chris@366 45 void fft_filend(FILE * fin,FILE * fout,int *dims,int ndims,int isinverse)
Chris@366 46 {
Chris@366 47 kiss_fftnd_cfg st;
Chris@366 48 kiss_fft_cpx *buf;
Chris@366 49 int dimprod=1,i;
Chris@366 50 for (i=0;i<ndims;++i)
Chris@366 51 dimprod *= dims[i];
Chris@366 52
Chris@366 53 buf = (kiss_fft_cpx *) malloc (sizeof (kiss_fft_cpx) * dimprod);
Chris@366 54 st = kiss_fftnd_alloc (dims, ndims, isinverse, 0, 0);
Chris@366 55
Chris@366 56 while (fread (buf, sizeof (kiss_fft_cpx) * dimprod, 1, fin) > 0) {
Chris@366 57 kiss_fftnd (st, buf, buf);
Chris@366 58 fwrite (buf, sizeof (kiss_fft_cpx), dimprod, fout);
Chris@366 59 }
Chris@366 60 free (st);
Chris@366 61 free (buf);
Chris@366 62 }
Chris@366 63
Chris@366 64
Chris@366 65
Chris@366 66 static
Chris@366 67 void fft_filend_real(FILE * fin,FILE * fout,int *dims,int ndims,int isinverse)
Chris@366 68 {
Chris@366 69 int dimprod=1,i;
Chris@366 70 kiss_fftndr_cfg st;
Chris@366 71 void *ibuf;
Chris@366 72 void *obuf;
Chris@366 73 int insize,outsize; // size in bytes
Chris@366 74
Chris@366 75 for (i=0;i<ndims;++i)
Chris@366 76 dimprod *= dims[i];
Chris@366 77 insize = outsize = dimprod;
Chris@366 78 int rdim = dims[ndims-1];
Chris@366 79
Chris@366 80 if (isinverse)
Chris@366 81 insize = insize*2*(rdim/2+1)/rdim;
Chris@366 82 else
Chris@366 83 outsize = outsize*2*(rdim/2+1)/rdim;
Chris@366 84
Chris@366 85 ibuf = malloc(insize*sizeof(kiss_fft_scalar));
Chris@366 86 obuf = malloc(outsize*sizeof(kiss_fft_scalar));
Chris@366 87
Chris@366 88 st = kiss_fftndr_alloc(dims, ndims, isinverse, 0, 0);
Chris@366 89
Chris@366 90 while ( fread (ibuf, sizeof(kiss_fft_scalar), insize, fin) > 0) {
Chris@366 91 if (isinverse) {
Chris@366 92 kiss_fftndri(st,
Chris@366 93 (kiss_fft_cpx*)ibuf,
Chris@366 94 (kiss_fft_scalar*)obuf);
Chris@366 95 }else{
Chris@366 96 kiss_fftndr(st,
Chris@366 97 (kiss_fft_scalar*)ibuf,
Chris@366 98 (kiss_fft_cpx*)obuf);
Chris@366 99 }
Chris@366 100 fwrite (obuf, sizeof(kiss_fft_scalar), outsize,fout);
Chris@366 101 }
Chris@366 102 free(st);
Chris@366 103 free(ibuf);
Chris@366 104 free(obuf);
Chris@366 105 }
Chris@366 106
Chris@366 107 static
Chris@366 108 void fft_file_real(FILE * fin,FILE * fout,int nfft,int isinverse)
Chris@366 109 {
Chris@366 110 kiss_fftr_cfg st;
Chris@366 111 kiss_fft_scalar * rbuf;
Chris@366 112 kiss_fft_cpx * cbuf;
Chris@366 113
Chris@366 114 rbuf = (kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar) * nfft );
Chris@366 115 cbuf = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * (nfft/2+1) );
Chris@366 116 st = kiss_fftr_alloc( nfft ,isinverse ,0,0);
Chris@366 117
Chris@366 118 if (isinverse==0) {
Chris@366 119 while ( fread( rbuf , sizeof(kiss_fft_scalar) * nfft ,1, fin ) > 0 ) {
Chris@366 120 kiss_fftr( st , rbuf ,cbuf);
Chris@366 121 fwrite( cbuf , sizeof(kiss_fft_cpx) , (nfft/2 + 1) , fout );
Chris@366 122 }
Chris@366 123 }else{
Chris@366 124 while ( fread( cbuf , sizeof(kiss_fft_cpx) * (nfft/2+1) ,1, fin ) > 0 ) {
Chris@366 125 kiss_fftri( st , cbuf ,rbuf);
Chris@366 126 fwrite( rbuf , sizeof(kiss_fft_scalar) , nfft , fout );
Chris@366 127 }
Chris@366 128 }
Chris@366 129 free(st);
Chris@366 130 free(rbuf);
Chris@366 131 free(cbuf);
Chris@366 132 }
Chris@366 133
Chris@366 134 static
Chris@366 135 int get_dims(char * arg,int * dims)
Chris@366 136 {
Chris@366 137 char *p0;
Chris@366 138 int ndims=0;
Chris@366 139
Chris@366 140 do{
Chris@366 141 p0 = strchr(arg,',');
Chris@366 142 if (p0)
Chris@366 143 *p0++ = '\0';
Chris@366 144 dims[ndims++] = atoi(arg);
Chris@366 145 // fprintf(stderr,"dims[%d] = %d\n",ndims-1,dims[ndims-1]);
Chris@366 146 arg = p0;
Chris@366 147 }while (p0);
Chris@366 148 return ndims;
Chris@366 149 }
Chris@366 150
Chris@366 151 int main(int argc,char ** argv)
Chris@366 152 {
Chris@366 153 int isinverse=0;
Chris@366 154 int isreal=0;
Chris@366 155 FILE *fin=stdin;
Chris@366 156 FILE *fout=stdout;
Chris@366 157 int ndims=1;
Chris@366 158 int dims[32];
Chris@366 159 dims[0] = 1024; /*default fft size*/
Chris@366 160
Chris@366 161 while (1) {
Chris@366 162 int c=getopt(argc,argv,"n:iR");
Chris@366 163 if (c==-1) break;
Chris@366 164 switch (c) {
Chris@366 165 case 'n':
Chris@366 166 ndims = get_dims(optarg,dims);
Chris@366 167 break;
Chris@366 168 case 'i':isinverse=1;break;
Chris@366 169 case 'R':isreal=1;break;
Chris@366 170 case '?':
Chris@366 171 fprintf(stderr,"usage options:\n"
Chris@366 172 "\t-n d1[,d2,d3...]: fft dimension(s)\n"
Chris@366 173 "\t-i : inverse\n"
Chris@366 174 "\t-R : real input samples, not complex\n");
Chris@366 175 exit (1);
Chris@366 176 default:fprintf(stderr,"bad %c\n",c);break;
Chris@366 177 }
Chris@366 178 }
Chris@366 179
Chris@366 180 if ( optind < argc ) {
Chris@366 181 if (strcmp("-",argv[optind]) !=0)
Chris@366 182 fin = fopen(argv[optind],"rb");
Chris@366 183 ++optind;
Chris@366 184 }
Chris@366 185
Chris@366 186 if ( optind < argc ) {
Chris@366 187 if ( strcmp("-",argv[optind]) !=0 )
Chris@366 188 fout = fopen(argv[optind],"wb");
Chris@366 189 ++optind;
Chris@366 190 }
Chris@366 191
Chris@366 192 if (ndims==1) {
Chris@366 193 if (isreal)
Chris@366 194 fft_file_real(fin,fout,dims[0],isinverse);
Chris@366 195 else
Chris@366 196 fft_file(fin,fout,dims[0],isinverse);
Chris@366 197 }else{
Chris@366 198 if (isreal)
Chris@366 199 fft_filend_real(fin,fout,dims,ndims,isinverse);
Chris@366 200 else
Chris@366 201 fft_filend(fin,fout,dims,ndims,isinverse);
Chris@366 202 }
Chris@366 203
Chris@366 204 if (fout!=stdout) fclose(fout);
Chris@366 205 if (fin!=stdin) fclose(fin);
Chris@366 206
Chris@366 207 return 0;
Chris@366 208 }