Advertisement
olelek

dft_test_1

Jun 24th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. /* https://batchloaf.wordpress.com/2013/12/07/simple-dft-in-c/ */
  5.  
  6. /*
  7. Pytania:
  8. 1. Składowa stała - próbka nr 0 - czemu trzeba wartość podzielić przez liczbę próbek aby była sensowna?
  9. 2. Nie ma co liczyć DFT dla drugiej połowy tablicy - lustrzana kopia pierwszej połowy (bez składowej stałej)
  10. 3. Wynik w postaci mocy vs w postaci argumentu - pierwiastkowanie przy liczeniu modułu zmniejsza wizualnie różnice pomiędzy wynikami
  11. 4. Dla FFT jak uniknąć kopiowania danych przy dzieleniu ciągów?
  12. 5. DFT z fragmentu DFT(t) - czy można uzyskać np. bpm utworu muzycznego? Czy ma to sens?
  13. 6. pozycja z tablicy DFT a odpowiednia częstotliwość? Rozumiem że całość to częstotliwość próbkowania
  14. 7. Jak zacząć z układami DSP - o co w ogóle w tym chodzi?
  15. 8. Estymatory - filtr Kalmanna
  16. 9. Szybka transformata Hartleya - czy warto się w to wgłębiać?
  17. 10. Czy można przyoszczędzić używając int zamiast float? Np. zrobić lookup table z wartościami 100*cos, 100*sin, dane 8bit, obliczenia na 16 bit?
  18. */
  19.  
  20.  
  21.  
  22. typedef struct CPLX{
  23.        float a;
  24.        float b;
  25. } CPLX;
  26.  
  27. void dft(float samples[], CPLX result[], int size){
  28.      int k;
  29.      for(k=0; k<size;++k){ //i = numer próbki DFT
  30.              //result[k].a = samples[k];
  31.              //result[k].b = -samples[k];
  32.              result[k].a = 0;
  33.              result[k].b = 0;
  34.              
  35.              int n;
  36.              for(n=0; n<size;++n){
  37.                 //czesc rzeczywista
  38.                 result[k].a += samples[n]*cos( ((k*n*2*M_PI)/(float)size)  );
  39.                
  40.                 //czesc urojona
  41.                 result[k].b += -samples[n]*sin((k*n*2*M_PI)/(float)size);
  42.                
  43.                
  44.               }
  45.                  
  46.            
  47.              
  48.      }
  49.      
  50.      
  51.      
  52. };
  53.  
  54. void fft(float samples[], CPLX result[], int size){
  55.      if (size ==2){
  56.         dft(samples, result, size);
  57.      }
  58.      else{
  59.         //dziel
  60.        
  61.         //fft podzielonych sampli
  62.        
  63.        
  64.         //łączenie
  65.        
  66.      }
  67.      
  68.  
  69. }
  70.  
  71.  
  72.  
  73.  
  74. int main(int argc, char *argv[]) {
  75.    
  76.     //float s[] = {0,1,2,3,4,5,6,7}; //sawtooth signal
  77.     //float s[] = {2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0}; //constant signal
  78.     float s[] = {1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0}; //square wave signal
  79.     //float s[1024];
  80.     CPLX res[sizeof(s)/sizeof(int)];   
  81.     int i;
  82.     int sz = sizeof(s)/sizeof(int);
  83.    
  84.     //input data
  85.     for(i=0;i<sz;++i){
  86.         //s[i] = sin(i);
  87.     }
  88.    
  89.    
  90.    
  91.    
  92.     printf("DFT Test 1\n" );
  93.    
  94.     printf("Samples: \n");
  95.     for(i=0;i<sz;++i){
  96.         printf("%f\n", s[i]);
  97.     }
  98.     //calculate DFT
  99.     dft(s, res, sz);
  100.    
  101.     printf("Result: \n");
  102.     for(i=0;i<sz;++i){
  103.         printf("%f + j%f\tABS = %f\n", res[i].a,res[i].b, sqrt(res[i].a*res[i].a +res[i].b*res[i].b ));
  104.     }
  105.     printf("Import to Excel: \n");
  106.     for(i=0;i<sz;++i){
  107.         printf("%d;%f\n", i, sqrt(res[i].a*res[i].a +res[i].b*res[i].b ));
  108.     }
  109.    
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement