00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <stdlib.h>
00034 #include <stdio.h>
00035
00036 double **PCMd;
00037 int maxsamples;
00038 int start;
00039
00040 int *ip;
00041 double *w;
00042 int new;
00043
00044
00045
00046
00047
00048
00049
00050 void initPCM(int samples)
00051 {
00052 int i;
00053
00054
00055 PCMd = (double **)malloc(2 * sizeof(double *));
00056 PCMd[0] = (double *)malloc(samples * sizeof(double));
00057 PCMd[1] = (double *)malloc(samples * sizeof(double));
00058
00059 maxsamples=samples;
00060 new=0;
00061
00062
00063 for (i=0;i<samples;i++)
00064 {
00065 PCMd[0][i]=0;
00066 PCMd[1][i]=0;
00067 }
00068
00069 start=0;
00070
00071
00072 w= (double *)malloc(maxsamples*sizeof(double));
00073 ip= (int *)malloc(maxsamples*sizeof(int));
00074 ip[0]=0;
00075 }
00076
00077
00078
00079
00080
00081
00082 void addPCM(int16_t PCMdata[2][512])
00083 {
00084 int i,j;
00085 int samples=512;
00086
00087 for(i=0;i<samples;i++)
00088 {
00089 j=i+start;
00090 PCMd[0][j%maxsamples]=(PCMdata[0][i]/16384.0);
00091 PCMd[1][j%maxsamples]=(PCMdata[1][i]/16384.0);
00092 }
00093
00094
00095
00096
00097 start+=samples;
00098 start=start%maxsamples;
00099
00100 new+=samples;
00101 if (new>maxsamples) new=maxsamples;
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 void getPCM(double *PCMdata, int samples, int channel, int freq, double smoothing, int derive)
00115 {
00116 int i,index;
00117
00118 index=start-1;
00119
00120 if (index<0) index=maxsamples+index;
00121
00122 PCMdata[0]=PCMd[channel][index];
00123
00124 for(i=1;i<samples;i++)
00125 {
00126 index=start-1-i;
00127 if (index<0) index=maxsamples+index;
00128
00129 PCMdata[i]=(1-smoothing)*PCMd[channel][index]+smoothing*PCMdata[i-1];
00130 }
00131
00132
00133 if(derive)
00134 {
00135 for(i=0;i<samples-1;i++)
00136 {
00137 PCMdata[i]=PCMdata[i]-PCMdata[i+1];
00138 }
00139 PCMdata[samples-1]=0;
00140 }
00141
00142
00143 if (freq) rdft(samples, 1, PCMdata, ip, w);
00144
00145
00146
00147 }
00148
00149
00150
00151
00152
00153
00154
00155 int getPCMnew(double *PCMdata, int channel, int freq, double smoothing, int derive, int reset)
00156 {
00157 int i,index;
00158
00159 index=start-1;
00160
00161 if (index<0) index=maxsamples+index;
00162
00163 PCMdata[0]=PCMd[channel][index];
00164
00165 for(i=1;i<new;i++)
00166 {
00167 index=start-1-i;
00168 if (index<0) index=maxsamples+index;
00169
00170 PCMdata[i]=(1-smoothing)*PCMd[channel][index]+smoothing*PCMdata[i-1];
00171 }
00172
00173
00174 if(derive)
00175 {
00176 for(i=0;i<new-1;i++)
00177 {
00178 PCMdata[i]=PCMdata[i]-PCMdata[i+1];
00179 }
00180 PCMdata[new-1]=0;
00181 }
00182
00183
00184
00185 i=new;
00186 if (reset) new=0;
00187
00188 return i;
00189 }
00190
00191
00192 void freePCM()
00193 {
00194 free(PCMd[0]);
00195 free(PCMd[1]);
00196 free(PCMd);
00197 free(ip);
00198 free(w);
00199 }