Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- /* https://batchloaf.wordpress.com/2013/12/07/simple-dft-in-c/ */
- /*
- Pytania:
- 1. Składowa stała - próbka nr 0 - czemu trzeba wartość podzielić przez liczbę próbek aby była sensowna?
- 2. Nie ma co liczyć DFT dla drugiej połowy tablicy - lustrzana kopia pierwszej połowy (bez składowej stałej)
- 3. Wynik w postaci mocy vs w postaci argumentu - pierwiastkowanie przy liczeniu modułu zmniejsza wizualnie różnice pomiędzy wynikami
- 4. Dla FFT jak uniknąć kopiowania danych przy dzieleniu ciągów?
- 5. DFT z fragmentu DFT(t) - czy można uzyskać np. bpm utworu muzycznego? Czy ma to sens?
- 6. pozycja z tablicy DFT a odpowiednia częstotliwość? Rozumiem że całość to częstotliwość próbkowania
- 7. Jak zacząć z układami DSP - o co w ogóle w tym chodzi?
- 8. Estymatory - filtr Kalmanna
- 9. Szybka transformata Hartleya - czy warto się w to wgłębiać?
- 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?
- */
- typedef struct CPLX{
- float a;
- float b;
- } CPLX;
- void dft(float samples[], CPLX result[], int size){
- int k;
- for(k=0; k<size;++k){ //i = numer próbki DFT
- //result[k].a = samples[k];
- //result[k].b = -samples[k];
- result[k].a = 0;
- result[k].b = 0;
- int n;
- for(n=0; n<size;++n){
- //czesc rzeczywista
- result[k].a += samples[n]*cos( ((k*n*2*M_PI)/(float)size) );
- //czesc urojona
- result[k].b += -samples[n]*sin((k*n*2*M_PI)/(float)size);
- }
- }
- };
- void fft(float samples[], CPLX result[], int size){
- if (size ==2){
- dft(samples, result, size);
- }
- else{
- //dziel
- //fft podzielonych sampli
- //łączenie
- }
- }
- int main(int argc, char *argv[]) {
- //float s[] = {0,1,2,3,4,5,6,7}; //sawtooth signal
- //float s[] = {2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0}; //constant signal
- float s[] = {1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0}; //square wave signal
- //float s[1024];
- CPLX res[sizeof(s)/sizeof(int)];
- int i;
- int sz = sizeof(s)/sizeof(int);
- //input data
- for(i=0;i<sz;++i){
- //s[i] = sin(i);
- }
- printf("DFT Test 1\n" );
- printf("Samples: \n");
- for(i=0;i<sz;++i){
- printf("%f\n", s[i]);
- }
- //calculate DFT
- dft(s, res, sz);
- printf("Result: \n");
- for(i=0;i<sz;++i){
- 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 ));
- }
- printf("Import to Excel: \n");
- for(i=0;i<sz;++i){
- printf("%d;%f\n", i, sqrt(res[i].a*res[i].a +res[i].b*res[i].b ));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement