Primeira versao
Dependencies: mbed EthernetInterface mbed-rtos
main.cpp@0:6218d050b1b9, 2014-06-25 (annotated)
- Committer:
- rebonatto
- Date:
- Wed Jun 25 14:56:54 2014 +0000
- Revision:
- 0:6218d050b1b9
- Child:
- 1:6c73db131ebc
Captura em 1Hz
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rebonatto | 0:6218d050b1b9 | 1 | #include "mbed.h" |
rebonatto | 0:6218d050b1b9 | 2 | #include "stdio.h" |
rebonatto | 0:6218d050b1b9 | 3 | |
rebonatto | 0:6218d050b1b9 | 4 | #define CONVERSAOAD 0.000021 |
rebonatto | 0:6218d050b1b9 | 5 | |
rebonatto | 0:6218d050b1b9 | 6 | #define CICLO 1 |
rebonatto | 0:6218d050b1b9 | 7 | #define AMOSTRAS 2048 |
rebonatto | 0:6218d050b1b9 | 8 | //#define INTERVALO (float) (1/CICLO)/AMOSTRAS |
rebonatto | 0:6218d050b1b9 | 9 | #define INTERVALO 0.0004882812 |
rebonatto | 0:6218d050b1b9 | 10 | |
rebonatto | 0:6218d050b1b9 | 11 | #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr |
rebonatto | 0:6218d050b1b9 | 12 | #define PI 3.14159265358979323846F |
rebonatto | 0:6218d050b1b9 | 13 | |
rebonatto | 0:6218d050b1b9 | 14 | LocalFileSystem local("local"); |
rebonatto | 0:6218d050b1b9 | 15 | |
rebonatto | 0:6218d050b1b9 | 16 | AnalogIn captura(p16); |
rebonatto | 0:6218d050b1b9 | 17 | |
rebonatto | 0:6218d050b1b9 | 18 | DigitalOut myled(LED1); |
rebonatto | 0:6218d050b1b9 | 19 | |
rebonatto | 0:6218d050b1b9 | 20 | float RMS(float *vet, int amostras); |
rebonatto | 0:6218d050b1b9 | 21 | int gravaAmostras(float *vet, int amostras); |
rebonatto | 0:6218d050b1b9 | 22 | void CalculateFFT(float *buffer, float *sen, float *cos, float *vm, int sign, int ch); |
rebonatto | 0:6218d050b1b9 | 23 | float* ComplexFFT(float* data, int sign, int ch); |
rebonatto | 0:6218d050b1b9 | 24 | float DFT(float *data, float *seno, float *coss); |
rebonatto | 0:6218d050b1b9 | 25 | int gravaDFT(float *seno, float *coss, int amostras); |
rebonatto | 0:6218d050b1b9 | 26 | |
rebonatto | 0:6218d050b1b9 | 27 | int main() { |
rebonatto | 0:6218d050b1b9 | 28 | float vet[AMOSTRAS]; |
rebonatto | 0:6218d050b1b9 | 29 | //float controle[AMOSTRAS]; |
rebonatto | 0:6218d050b1b9 | 30 | float seno[AMOSTRAS]; |
rebonatto | 0:6218d050b1b9 | 31 | float coss[AMOSTRAS]; |
rebonatto | 0:6218d050b1b9 | 32 | float vm; |
rebonatto | 0:6218d050b1b9 | 33 | int i, flag =0; |
rebonatto | 0:6218d050b1b9 | 34 | Timer t; |
rebonatto | 0:6218d050b1b9 | 35 | unsigned short int valor, maior=0, menor=0; |
rebonatto | 0:6218d050b1b9 | 36 | float espera,rms; |
rebonatto | 0:6218d050b1b9 | 37 | float media = 0; |
rebonatto | 0:6218d050b1b9 | 38 | |
rebonatto | 0:6218d050b1b9 | 39 | printf("CONVERSAOAD %1.10f\n", CONVERSAOAD); |
rebonatto | 0:6218d050b1b9 | 40 | printf("PORTA p16 Diferencial 2\n"); |
rebonatto | 0:6218d050b1b9 | 41 | printf("Ciclos (HZ) %d\n", CICLO); |
rebonatto | 0:6218d050b1b9 | 42 | printf("Amostras %d\n", AMOSTRAS); |
rebonatto | 0:6218d050b1b9 | 43 | printf("Intervalo %1.10f\n", INTERVALO); |
rebonatto | 0:6218d050b1b9 | 44 | |
rebonatto | 0:6218d050b1b9 | 45 | for(int j =0; j < 50; j++){ |
rebonatto | 0:6218d050b1b9 | 46 | t.start(); |
rebonatto | 0:6218d050b1b9 | 47 | for(i=0; i < AMOSTRAS; i++){ |
rebonatto | 0:6218d050b1b9 | 48 | //controle[i] = t.read(); |
rebonatto | 0:6218d050b1b9 | 49 | valor = captura.read_u16(); |
rebonatto | 0:6218d050b1b9 | 50 | vet[i] = (float) (valor - 33575) / 10830; //acquire the value and convert the analog to digital |
rebonatto | 0:6218d050b1b9 | 51 | /* |
rebonatto | 0:6218d050b1b9 | 52 | if(i == 0) |
rebonatto | 0:6218d050b1b9 | 53 | maior = menor = valor; |
rebonatto | 0:6218d050b1b9 | 54 | if (valor > maior) |
rebonatto | 0:6218d050b1b9 | 55 | maior = valor; |
rebonatto | 0:6218d050b1b9 | 56 | if (valor < menor) |
rebonatto | 0:6218d050b1b9 | 57 | menor = valor; |
rebonatto | 0:6218d050b1b9 | 58 | */ |
rebonatto | 0:6218d050b1b9 | 59 | espera = (INTERVALO * (i+1)) - t.read(); |
rebonatto | 0:6218d050b1b9 | 60 | wait(espera); |
rebonatto | 0:6218d050b1b9 | 61 | } |
rebonatto | 0:6218d050b1b9 | 62 | printf("Acabou captura. Tempo %1.10f\n", t.read() ); |
rebonatto | 0:6218d050b1b9 | 63 | |
rebonatto | 0:6218d050b1b9 | 64 | //printf("Tempo de Captura %1.10f\n", t.read()); |
rebonatto | 0:6218d050b1b9 | 65 | |
rebonatto | 0:6218d050b1b9 | 66 | media=0; |
rebonatto | 0:6218d050b1b9 | 67 | for(i=0; i < AMOSTRAS; i++){ |
rebonatto | 0:6218d050b1b9 | 68 | if(i == 0) |
rebonatto | 0:6218d050b1b9 | 69 | maior = menor = valor; |
rebonatto | 0:6218d050b1b9 | 70 | if (vet[i] > maior) |
rebonatto | 0:6218d050b1b9 | 71 | maior = (unsigned short int) vet[i]; |
rebonatto | 0:6218d050b1b9 | 72 | if (vet[i] < menor) |
rebonatto | 0:6218d050b1b9 | 73 | menor = (unsigned short int) vet[i]; |
rebonatto | 0:6218d050b1b9 | 74 | media += vet[i]; |
rebonatto | 0:6218d050b1b9 | 75 | } |
rebonatto | 0:6218d050b1b9 | 76 | |
rebonatto | 0:6218d050b1b9 | 77 | //t.reset(); |
rebonatto | 0:6218d050b1b9 | 78 | //vm = DFT(vet, seno, coss); |
rebonatto | 0:6218d050b1b9 | 79 | //CalculateFFT(vet, seno, coss, &vm, 1, 0); |
rebonatto | 0:6218d050b1b9 | 80 | //gravaDFT(seno, coss, AMOSTRAS); |
rebonatto | 0:6218d050b1b9 | 81 | //printf("Calculou DFT em %fs\n", t.read()); |
rebonatto | 0:6218d050b1b9 | 82 | rms = RMS(vet, AMOSTRAS); |
rebonatto | 0:6218d050b1b9 | 83 | if (rms > 0.6){ |
rebonatto | 0:6218d050b1b9 | 84 | flag++; |
rebonatto | 0:6218d050b1b9 | 85 | if (flag > 1){ |
rebonatto | 0:6218d050b1b9 | 86 | gravaAmostras(vet, AMOSTRAS); |
rebonatto | 0:6218d050b1b9 | 87 | break; |
rebonatto | 0:6218d050b1b9 | 88 | printf("Gravou amostras\n"); |
rebonatto | 0:6218d050b1b9 | 89 | flag = -1000; |
rebonatto | 0:6218d050b1b9 | 90 | } |
rebonatto | 0:6218d050b1b9 | 91 | } |
rebonatto | 0:6218d050b1b9 | 92 | printf("[%d] RMS %1.8f Menor %d Maior %d Media %1.8f VM %1.8f\n", j, RMS(vet, AMOSTRAS), menor, maior, vm, (float) media/AMOSTRAS); |
rebonatto | 0:6218d050b1b9 | 93 | |
rebonatto | 0:6218d050b1b9 | 94 | //wait(5); |
rebonatto | 0:6218d050b1b9 | 95 | /* |
rebonatto | 0:6218d050b1b9 | 96 | for(i=0; i < AMOSTRAS; i++){ |
rebonatto | 0:6218d050b1b9 | 97 | printf("[%d] Valor %f\tTempo %1.10f\n", i, vet[i], controle[i]); |
rebonatto | 0:6218d050b1b9 | 98 | } |
rebonatto | 0:6218d050b1b9 | 99 | float maior =-10; |
rebonatto | 0:6218d050b1b9 | 100 | float media = 0; |
rebonatto | 0:6218d050b1b9 | 101 | for(i=2; i < AMOSTRAS; i++){ |
rebonatto | 0:6218d050b1b9 | 102 | espera = (controle[i] - controle[i-1] - INTERVALO); |
rebonatto | 0:6218d050b1b9 | 103 | media += espera; |
rebonatto | 0:6218d050b1b9 | 104 | if (espera > 0.000001){ |
rebonatto | 0:6218d050b1b9 | 105 | //printf("[%d] Diferenca %f\n", i, espera); |
rebonatto | 0:6218d050b1b9 | 106 | if (espera > maior) |
rebonatto | 0:6218d050b1b9 | 107 | maior = espera; |
rebonatto | 0:6218d050b1b9 | 108 | } |
rebonatto | 0:6218d050b1b9 | 109 | } |
rebonatto | 0:6218d050b1b9 | 110 | printf("[%d] MAior difrenca %1.10f Media %1.10f\n", j, maior, (float) media/AMOSTRAS); |
rebonatto | 0:6218d050b1b9 | 111 | */ |
rebonatto | 0:6218d050b1b9 | 112 | } |
rebonatto | 0:6218d050b1b9 | 113 | printf("FINAL"); |
rebonatto | 0:6218d050b1b9 | 114 | while(1) { |
rebonatto | 0:6218d050b1b9 | 115 | myled = 1; |
rebonatto | 0:6218d050b1b9 | 116 | wait(0.2); |
rebonatto | 0:6218d050b1b9 | 117 | myled = 0; |
rebonatto | 0:6218d050b1b9 | 118 | wait(0.2); |
rebonatto | 0:6218d050b1b9 | 119 | } |
rebonatto | 0:6218d050b1b9 | 120 | } |
rebonatto | 0:6218d050b1b9 | 121 | |
rebonatto | 0:6218d050b1b9 | 122 | void CalculateFFT(float *buffer, float *sen, float *cos, float *vm, int sign, int ch) |
rebonatto | 0:6218d050b1b9 | 123 | { |
rebonatto | 0:6218d050b1b9 | 124 | int i; |
rebonatto | 0:6218d050b1b9 | 125 | //float value[256]; |
rebonatto | 0:6218d050b1b9 | 126 | /* |
rebonatto | 0:6218d050b1b9 | 127 | printf("Tamanho float %lu\n", sizeof(float)); |
rebonatto | 0:6218d050b1b9 | 128 | printf("Tamanho double %lu\n", sizeof(double)); |
rebonatto | 0:6218d050b1b9 | 129 | printf("Tamanho unsigned short int %lu\n", sizeof(unsigned short int)); |
rebonatto | 0:6218d050b1b9 | 130 | printf("Tamanho unsigned long %lu\n", sizeof(unsigned long)); |
rebonatto | 0:6218d050b1b9 | 131 | printf("Tamanho unsigned long long %lu\n", sizeof(unsigned long long)); |
rebonatto | 0:6218d050b1b9 | 132 | |
rebonatto | 0:6218d050b1b9 | 133 | |
rebonatto | 0:6218d050b1b9 | 134 | for(int i=0; i < Settings::get_Samples(); i++) |
rebonatto | 0:6218d050b1b9 | 135 | printf("%d*",buffer[i]); |
rebonatto | 0:6218d050b1b9 | 136 | printf("\n"); |
rebonatto | 0:6218d050b1b9 | 137 | */ |
rebonatto | 0:6218d050b1b9 | 138 | //printf("[0] %d %d %d %d\n", buffer[0], buffer[100], buffer[200], buffer[255]); |
rebonatto | 0:6218d050b1b9 | 139 | /* |
rebonatto | 0:6218d050b1b9 | 140 | for(i=0; i<Settings::get_Samples();i++) |
rebonatto | 0:6218d050b1b9 | 141 | value[i]= (float) ( (buffer[i] - Settings::get_Offset(ch)) / Settings::get_Gain(ch) ); |
rebonatto | 0:6218d050b1b9 | 142 | */ |
rebonatto | 0:6218d050b1b9 | 143 | |
rebonatto | 0:6218d050b1b9 | 144 | printf("Chegou chamada\n"); |
rebonatto | 0:6218d050b1b9 | 145 | float* fft = ComplexFFT(buffer,1, 0); //deve desalocar memoria do ptr retornado |
rebonatto | 0:6218d050b1b9 | 146 | |
rebonatto | 0:6218d050b1b9 | 147 | /* |
rebonatto | 0:6218d050b1b9 | 148 | Mapa do vetor fft. |
rebonatto | 0:6218d050b1b9 | 149 | O vetor tem 2 vezes o no. de amostras. Cada par de valores (portanto n e n+1), representam, respectivamente |
rebonatto | 0:6218d050b1b9 | 150 | COS e SEN. |
rebonatto | 0:6218d050b1b9 | 151 | Os dois primeiros valores reprensetam a frequencia 0Hz, portanto sao atribuidas ao valor medio. |
rebonatto | 0:6218d050b1b9 | 152 | Os demais pares de valores representam a fundamental e suas harmonicas, |
rebonatto | 0:6218d050b1b9 | 153 | sendo que se a fundamental for 60Hz, teremos: 60,120,180,240... |
rebonatto | 0:6218d050b1b9 | 154 | Para a nossa aplicacao apenas as 12 primeiras harmonicas serao utilizadas (720Hz) |
rebonatto | 0:6218d050b1b9 | 155 | */ |
rebonatto | 0:6218d050b1b9 | 156 | |
rebonatto | 0:6218d050b1b9 | 157 | //*vm = DFT(value, sen, cos); |
rebonatto | 0:6218d050b1b9 | 158 | *vm = fft[0]; |
rebonatto | 0:6218d050b1b9 | 159 | |
rebonatto | 0:6218d050b1b9 | 160 | for(int i=1;i<AMOSTRAS/2;i++) |
rebonatto | 0:6218d050b1b9 | 161 | { |
rebonatto | 0:6218d050b1b9 | 162 | cos[i-1] = fft[i*2]; |
rebonatto | 0:6218d050b1b9 | 163 | sen[i-1] = fft[i*2+1]; |
rebonatto | 0:6218d050b1b9 | 164 | } |
rebonatto | 0:6218d050b1b9 | 165 | |
rebonatto | 0:6218d050b1b9 | 166 | for(int i=0;i<AMOSTRAS;i++) |
rebonatto | 0:6218d050b1b9 | 167 | { |
rebonatto | 0:6218d050b1b9 | 168 | printf("[%dHz]\tsen %.4f\tcos %.4f\n", (i+1)*60, sen[i], cos[i]); |
rebonatto | 0:6218d050b1b9 | 169 | if (i > 100) |
rebonatto | 0:6218d050b1b9 | 170 | break; |
rebonatto | 0:6218d050b1b9 | 171 | } |
rebonatto | 0:6218d050b1b9 | 172 | |
rebonatto | 0:6218d050b1b9 | 173 | free(fft); |
rebonatto | 0:6218d050b1b9 | 174 | //printf("[3] %d %d %d %d\n", buffer[0], buffer[100], buffer[200], buffer[255]); |
rebonatto | 0:6218d050b1b9 | 175 | } |
rebonatto | 0:6218d050b1b9 | 176 | |
rebonatto | 0:6218d050b1b9 | 177 | |
rebonatto | 0:6218d050b1b9 | 178 | float* ComplexFFT(float* data, int sign, int ch) |
rebonatto | 0:6218d050b1b9 | 179 | { |
rebonatto | 0:6218d050b1b9 | 180 | |
rebonatto | 0:6218d050b1b9 | 181 | //variables for the fft |
rebonatto | 0:6218d050b1b9 | 182 | unsigned long n,mmax,m,j,istep,i; |
rebonatto | 0:6218d050b1b9 | 183 | //double wtemp,wr,wpr,wpi,wi,theta,tempr,tempi; |
rebonatto | 0:6218d050b1b9 | 184 | float wtemp,wr,wpr,wpi,wi,theta,tempr,tempi; |
rebonatto | 0:6218d050b1b9 | 185 | float *vector; |
rebonatto | 0:6218d050b1b9 | 186 | //the complex array is real+complex so the array |
rebonatto | 0:6218d050b1b9 | 187 | //as a size n = 2* number of complex samples |
rebonatto | 0:6218d050b1b9 | 188 | //real part is the data[index] and |
rebonatto | 0:6218d050b1b9 | 189 | //the complex part is the data[index+1] |
rebonatto | 0:6218d050b1b9 | 190 | |
rebonatto | 0:6218d050b1b9 | 191 | //new complex array of size n=2*sample_rate |
rebonatto | 0:6218d050b1b9 | 192 | //if(vector==0) |
rebonatto | 0:6218d050b1b9 | 193 | //vector=(float*)malloc(2*SAMPLE_RATE*sizeof(float)); era assim, define estava em Capture.h |
rebonatto | 0:6218d050b1b9 | 194 | |
rebonatto | 0:6218d050b1b9 | 195 | printf("Chegou compex\n"); |
rebonatto | 0:6218d050b1b9 | 196 | |
rebonatto | 0:6218d050b1b9 | 197 | vector=(float*)malloc(2*AMOSTRAS*sizeof(float)); |
rebonatto | 0:6218d050b1b9 | 198 | if (vector == NULL) |
rebonatto | 0:6218d050b1b9 | 199 | printf("Sem memoria\n"); |
rebonatto | 0:6218d050b1b9 | 200 | memset(vector,0,2*AMOSTRAS*sizeof(float)); |
rebonatto | 0:6218d050b1b9 | 201 | |
rebonatto | 0:6218d050b1b9 | 202 | //put the real array in a complex array |
rebonatto | 0:6218d050b1b9 | 203 | //the complex part is filled with 0's |
rebonatto | 0:6218d050b1b9 | 204 | //the remaining vector with no data is filled with 0's |
rebonatto | 0:6218d050b1b9 | 205 | //for(n=0; n<SAMPLE_RATE;n++)era assim, define estava em Capture.h |
rebonatto | 0:6218d050b1b9 | 206 | |
rebonatto | 0:6218d050b1b9 | 207 | printf("Alocou\n"); |
rebonatto | 0:6218d050b1b9 | 208 | |
rebonatto | 0:6218d050b1b9 | 209 | for(n=0; n<AMOSTRAS;n++) |
rebonatto | 0:6218d050b1b9 | 210 | { |
rebonatto | 0:6218d050b1b9 | 211 | if(n<AMOSTRAS){ |
rebonatto | 0:6218d050b1b9 | 212 | vector[2*n]= (float) data[n] ; |
rebonatto | 0:6218d050b1b9 | 213 | // printf("%.4f$", vector[2*n]); |
rebonatto | 0:6218d050b1b9 | 214 | } |
rebonatto | 0:6218d050b1b9 | 215 | else |
rebonatto | 0:6218d050b1b9 | 216 | vector[2*n]=0; |
rebonatto | 0:6218d050b1b9 | 217 | vector[2*n+1]=0; |
rebonatto | 0:6218d050b1b9 | 218 | } |
rebonatto | 0:6218d050b1b9 | 219 | |
rebonatto | 0:6218d050b1b9 | 220 | printf("\n"); |
rebonatto | 0:6218d050b1b9 | 221 | |
rebonatto | 0:6218d050b1b9 | 222 | //printf("[1] %d %d %d %d\n", data[0], data[100], data[200], data[255]); |
rebonatto | 0:6218d050b1b9 | 223 | |
rebonatto | 0:6218d050b1b9 | 224 | //binary inversion (note that the indexes |
rebonatto | 0:6218d050b1b9 | 225 | //start from 0 witch means that the |
rebonatto | 0:6218d050b1b9 | 226 | //real part of the complex is on the even-indexes |
rebonatto | 0:6218d050b1b9 | 227 | //and the complex part is on the odd-indexes) |
rebonatto | 0:6218d050b1b9 | 228 | //n=SAMPLE_RATE << 1; //multiply by 2era assim, define estava em Capture.h |
rebonatto | 0:6218d050b1b9 | 229 | n=AMOSTRAS << 1; //multiply by 2 |
rebonatto | 0:6218d050b1b9 | 230 | j=0; |
rebonatto | 0:6218d050b1b9 | 231 | for (i=0;i<n/2;i+=2) { |
rebonatto | 0:6218d050b1b9 | 232 | if (j > i) { |
rebonatto | 0:6218d050b1b9 | 233 | SWAP(vector[j],vector[i]); |
rebonatto | 0:6218d050b1b9 | 234 | SWAP(vector[j+1],vector[i+1]); |
rebonatto | 0:6218d050b1b9 | 235 | if((j/2)<(n/4)){ |
rebonatto | 0:6218d050b1b9 | 236 | SWAP(vector[(n-(i+2))],vector[(n-(j+2))]); |
rebonatto | 0:6218d050b1b9 | 237 | SWAP(vector[(n-(i+2))+1],vector[(n-(j+2))+1]); |
rebonatto | 0:6218d050b1b9 | 238 | } |
rebonatto | 0:6218d050b1b9 | 239 | } |
rebonatto | 0:6218d050b1b9 | 240 | m=n >> 1; |
rebonatto | 0:6218d050b1b9 | 241 | while (m >= 2 && j >= m) { |
rebonatto | 0:6218d050b1b9 | 242 | j -= m; |
rebonatto | 0:6218d050b1b9 | 243 | m >>= 1; |
rebonatto | 0:6218d050b1b9 | 244 | } |
rebonatto | 0:6218d050b1b9 | 245 | j += m; |
rebonatto | 0:6218d050b1b9 | 246 | } |
rebonatto | 0:6218d050b1b9 | 247 | //end of the bit-reversed order algorithm |
rebonatto | 0:6218d050b1b9 | 248 | |
rebonatto | 0:6218d050b1b9 | 249 | //Danielson-Lanzcos routine |
rebonatto | 0:6218d050b1b9 | 250 | mmax=2; |
rebonatto | 0:6218d050b1b9 | 251 | while (n > mmax) { |
rebonatto | 0:6218d050b1b9 | 252 | istep=mmax << 1; |
rebonatto | 0:6218d050b1b9 | 253 | theta=sign*(2*PI/mmax); |
rebonatto | 0:6218d050b1b9 | 254 | wtemp=sin(0.5*theta); |
rebonatto | 0:6218d050b1b9 | 255 | wpr = -2.0*wtemp*wtemp; |
rebonatto | 0:6218d050b1b9 | 256 | wpi=sin(theta); |
rebonatto | 0:6218d050b1b9 | 257 | wr=1.0; |
rebonatto | 0:6218d050b1b9 | 258 | wi=0.0; |
rebonatto | 0:6218d050b1b9 | 259 | for (m=1;m<mmax;m+=2) { |
rebonatto | 0:6218d050b1b9 | 260 | for (i=m;i<=n;i+=istep) { |
rebonatto | 0:6218d050b1b9 | 261 | j=i+mmax; |
rebonatto | 0:6218d050b1b9 | 262 | tempr=wr*vector[j-1]-wi*vector[j]; |
rebonatto | 0:6218d050b1b9 | 263 | tempi=wr*vector[j]+wi*vector[j-1]; |
rebonatto | 0:6218d050b1b9 | 264 | vector[j-1]=vector[i-1]-tempr; |
rebonatto | 0:6218d050b1b9 | 265 | vector[j]=vector[i]-tempi; |
rebonatto | 0:6218d050b1b9 | 266 | vector[i-1] += tempr; |
rebonatto | 0:6218d050b1b9 | 267 | vector[i] += tempi; |
rebonatto | 0:6218d050b1b9 | 268 | } |
rebonatto | 0:6218d050b1b9 | 269 | wr=(wtemp=wr)*wpr-wi*wpi+wr; |
rebonatto | 0:6218d050b1b9 | 270 | wi=wi*wpr+wtemp*wpi+wi; |
rebonatto | 0:6218d050b1b9 | 271 | } |
rebonatto | 0:6218d050b1b9 | 272 | mmax=istep; |
rebonatto | 0:6218d050b1b9 | 273 | } |
rebonatto | 0:6218d050b1b9 | 274 | //end of the algorithm |
rebonatto | 0:6218d050b1b9 | 275 | |
rebonatto | 0:6218d050b1b9 | 276 | // Ajustes a FFT |
rebonatto | 0:6218d050b1b9 | 277 | for(i = 0; i < AMOSTRAS; i++ ){ |
rebonatto | 0:6218d050b1b9 | 278 | vector[i] = (float) ((2 * vector[i]) / AMOSTRAS ); |
rebonatto | 0:6218d050b1b9 | 279 | /* |
rebonatto | 0:6218d050b1b9 | 280 | if (i % 2 == 1) |
rebonatto | 0:6218d050b1b9 | 281 | vector[i] = vector[i] * -1; |
rebonatto | 0:6218d050b1b9 | 282 | */ |
rebonatto | 0:6218d050b1b9 | 283 | } |
rebonatto | 0:6218d050b1b9 | 284 | |
rebonatto | 0:6218d050b1b9 | 285 | //printf("[2] %d %d %d %d\n", data[0], data[100], data[200], data[255]); |
rebonatto | 0:6218d050b1b9 | 286 | |
rebonatto | 0:6218d050b1b9 | 287 | return vector; |
rebonatto | 0:6218d050b1b9 | 288 | } |
rebonatto | 0:6218d050b1b9 | 289 | |
rebonatto | 0:6218d050b1b9 | 290 | float DFT(float *data, float *seno, float *coss){ |
rebonatto | 0:6218d050b1b9 | 291 | int i, j; |
rebonatto | 0:6218d050b1b9 | 292 | |
rebonatto | 0:6218d050b1b9 | 293 | printf("Entrou DFT\n"); |
rebonatto | 0:6218d050b1b9 | 294 | |
rebonatto | 0:6218d050b1b9 | 295 | for(i=0; i < AMOSTRAS; i++) |
rebonatto | 0:6218d050b1b9 | 296 | seno[i] = coss[i] = 0; |
rebonatto | 0:6218d050b1b9 | 297 | |
rebonatto | 0:6218d050b1b9 | 298 | for(i=0; i < AMOSTRAS; i++){ |
rebonatto | 0:6218d050b1b9 | 299 | for(j = 0; j < AMOSTRAS; j++ ){ |
rebonatto | 0:6218d050b1b9 | 300 | coss[j] += (data[i] * (cos( (2 * PI * i * j) / AMOSTRAS ) ) ) ; |
rebonatto | 0:6218d050b1b9 | 301 | seno[j] += (data[i] * (sin( (2 * PI * i * j) / AMOSTRAS ) ) ) ; |
rebonatto | 0:6218d050b1b9 | 302 | } |
rebonatto | 0:6218d050b1b9 | 303 | } |
rebonatto | 0:6218d050b1b9 | 304 | printf("Primeiro Laco\n"); |
rebonatto | 0:6218d050b1b9 | 305 | for(j = 1; j < AMOSTRAS; j++ ){ |
rebonatto | 0:6218d050b1b9 | 306 | coss[j] = 2 * coss[j] / AMOSTRAS; |
rebonatto | 0:6218d050b1b9 | 307 | seno[j] = 2 * seno[j] / AMOSTRAS ; |
rebonatto | 0:6218d050b1b9 | 308 | } |
rebonatto | 0:6218d050b1b9 | 309 | |
rebonatto | 0:6218d050b1b9 | 310 | printf("Segundo Laco\n"); |
rebonatto | 0:6218d050b1b9 | 311 | coss[0] = coss[0] / AMOSTRAS; |
rebonatto | 0:6218d050b1b9 | 312 | seno[0] = seno[0] / AMOSTRAS; |
rebonatto | 0:6218d050b1b9 | 313 | return (float) (coss[0] + seno[0] ); |
rebonatto | 0:6218d050b1b9 | 314 | } |
rebonatto | 0:6218d050b1b9 | 315 | |
rebonatto | 0:6218d050b1b9 | 316 | int gravaDFT(float *seno, float *coss, int amostras){ |
rebonatto | 0:6218d050b1b9 | 317 | int i; |
rebonatto | 0:6218d050b1b9 | 318 | FILE *f = fopen("/local/resultados.txt","w"); |
rebonatto | 0:6218d050b1b9 | 319 | |
rebonatto | 0:6218d050b1b9 | 320 | if(f == NULL) |
rebonatto | 0:6218d050b1b9 | 321 | { |
rebonatto | 0:6218d050b1b9 | 322 | printf("Error creating file resultados.txt\r\n"); |
rebonatto | 0:6218d050b1b9 | 323 | return 0; |
rebonatto | 0:6218d050b1b9 | 324 | } |
rebonatto | 0:6218d050b1b9 | 325 | |
rebonatto | 0:6218d050b1b9 | 326 | fprintf(f, "Arquivo de Resultados\n"); |
rebonatto | 0:6218d050b1b9 | 327 | for(i=0; i < amostras; i++){ |
rebonatto | 0:6218d050b1b9 | 328 | fprintf(f,"%1.4f\t%1.4f\n", seno[i], coss[i]); |
rebonatto | 0:6218d050b1b9 | 329 | } |
rebonatto | 0:6218d050b1b9 | 330 | fprintf(f,"\r\n"); |
rebonatto | 0:6218d050b1b9 | 331 | fclose(f); |
rebonatto | 0:6218d050b1b9 | 332 | return (1); |
rebonatto | 0:6218d050b1b9 | 333 | } |
rebonatto | 0:6218d050b1b9 | 334 | |
rebonatto | 0:6218d050b1b9 | 335 | |
rebonatto | 0:6218d050b1b9 | 336 | int gravaAmostras(float *vet, int amostras){ |
rebonatto | 0:6218d050b1b9 | 337 | int i; |
rebonatto | 0:6218d050b1b9 | 338 | FILE *f = fopen("/local/amostras.txt","w"); |
rebonatto | 0:6218d050b1b9 | 339 | |
rebonatto | 0:6218d050b1b9 | 340 | if(f == NULL) |
rebonatto | 0:6218d050b1b9 | 341 | { |
rebonatto | 0:6218d050b1b9 | 342 | printf("Error creating file amostras.txt\r\n"); |
rebonatto | 0:6218d050b1b9 | 343 | return 0; |
rebonatto | 0:6218d050b1b9 | 344 | } |
rebonatto | 0:6218d050b1b9 | 345 | |
rebonatto | 0:6218d050b1b9 | 346 | fprintf(f, "Arquivo de Amostras\n"); |
rebonatto | 0:6218d050b1b9 | 347 | for(i=0; i < amostras; i++){ |
rebonatto | 0:6218d050b1b9 | 348 | fprintf(f,"%1.4f\n", vet[i]); |
rebonatto | 0:6218d050b1b9 | 349 | printf("%1.4f*", vet[i]); |
rebonatto | 0:6218d050b1b9 | 350 | } |
rebonatto | 0:6218d050b1b9 | 351 | fprintf(f,"\r\n"); |
rebonatto | 0:6218d050b1b9 | 352 | fclose(f); |
rebonatto | 0:6218d050b1b9 | 353 | return (1); |
rebonatto | 0:6218d050b1b9 | 354 | } |
rebonatto | 0:6218d050b1b9 | 355 | |
rebonatto | 0:6218d050b1b9 | 356 | |
rebonatto | 0:6218d050b1b9 | 357 | float RMS(float *vet, int amostras){ |
rebonatto | 0:6218d050b1b9 | 358 | int i; |
rebonatto | 0:6218d050b1b9 | 359 | float aux, soma=0; |
rebonatto | 0:6218d050b1b9 | 360 | |
rebonatto | 0:6218d050b1b9 | 361 | for(i=0; i < amostras; i++){ |
rebonatto | 0:6218d050b1b9 | 362 | aux = vet[i] * vet[i]; |
rebonatto | 0:6218d050b1b9 | 363 | soma += aux; |
rebonatto | 0:6218d050b1b9 | 364 | } |
rebonatto | 0:6218d050b1b9 | 365 | soma = (float) soma / amostras; |
rebonatto | 0:6218d050b1b9 | 366 | return (sqrt(soma)); |
rebonatto | 0:6218d050b1b9 | 367 | } |