Guest User

Untitled

a guest
Dec 1st, 2013
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include "hardware.h"
  6. #include "kiss_fft.h"
  7.  
  8.  
  9. #include "stm32f4_discovery.h"
  10. #include "stm32f4xx_tim.h"
  11.  
  12. volatile int g_milliseconds = 0;
  13.  
  14. #define RINGBUFFER_SIZE (4 * BUFFER_SIZE)
  15. uint32_t g_ringbuffer[RINGBUFFER_SIZE];
  16. int g_ringbufferReadIndex = 0;
  17. int g_ringbufferWriteIndex = 0;
  18.  
  19. // called at 1 kHz
  20. void tick()
  21. {
  22.     g_milliseconds++;
  23.     if (g_milliseconds > 500) {
  24.         setGreenLed(1);
  25.     } else {
  26.         setGreenLed(0);
  27.     }
  28.     if (g_milliseconds == 1000) g_milliseconds = 0;
  29. }
  30.  
  31. void onFillSamples(uint32_t* samples, uint32_t count)
  32. {
  33.     int i;
  34.     for (i = 0; i < count; i++) {
  35.         samples[i] = g_ringbuffer[g_ringbufferReadIndex++];
  36.         if (g_ringbufferReadIndex == RINGBUFFER_SIZE) g_ringbufferReadIndex = 0;
  37.     }
  38. }
  39.  
  40. void onSamplesReceived(uint32_t* samples, uint32_t count)
  41. {
  42.     static int c = 0;
  43.     int i;
  44.     for (i = 0; i < count; i++) {
  45.         g_ringbuffer[g_ringbufferWriteIndex++] = samples[i];
  46.         if (g_ringbufferWriteIndex == RINGBUFFER_SIZE) g_ringbufferWriteIndex = 0;
  47.         if (c++ >= 192000) {
  48.             //static int tick = 0;
  49.             //printf(++tick&1 ? "tick\n" : "tack\n");
  50.             c = 0;
  51.         }
  52.     }
  53. }
  54.  
  55.  
  56. #define MAX_FFT_SIZE 2048
  57.  
  58. kiss_fft_cfg mycfg;
  59. kiss_fft_cpx fin[MAX_FFT_SIZE];
  60. kiss_fft_cpx fout[MAX_FFT_SIZE];
  61.  
  62. void startTimer()
  63. {
  64.     resetTime();
  65. }
  66.  
  67. int getMilliseconds()
  68. {
  69.     return getTime() / 1000;
  70. }
  71.  
  72. void testFFT(int size, int do_dB)
  73. {
  74.     mycfg = kiss_fft_alloc(size, size, NULL, NULL);
  75.     float sum = 0;
  76.     int count = 10000;
  77.     int c;
  78.     startTimer();
  79.     for (c = 0; c < count; c++) {
  80.         int j;
  81.         for (j = 0; j < size; j++) {
  82.             fin[j].r = c + j;
  83.             fin[j].i = c * j * 0.1f;
  84.         }
  85.         kiss_fft(mycfg, fin, fout);
  86.         if (do_dB) {
  87.             for (j = 0; j < size; j++) {
  88.                 float r = fout[j].r;
  89.                 float i = fout[j].i;
  90.                 sum += 10 * log10f(r * r + i * i);  // == 20 * log10(sqrt(..))
  91.             }
  92.         } else {
  93.             for (j = 0; j < size; j++) {
  94.                 sum += fout[j].r;
  95.                 sum += fout[j].i;
  96.             }
  97.         }
  98.     }
  99.     int ms = getMilliseconds();
  100.     printf("size: %i, time: %f ms, with dB: %s, sum: %f\n", size, ((float) ms) / ((float) count), do_dB ? "yes" : "no", sum);
  101. }
  102.  
  103. int main()
  104. {
  105.     int i;
  106.     for (i = 0; i < RINGBUFFER_SIZE / 2; i++) {
  107.         g_ringbuffer[g_ringbufferWriteIndex++] = 0;
  108.     }
  109.     initHardware();
  110.     printf("hardware initialized\n");
  111.     int size = 256;
  112.     while (1) {
  113.         testFFT(size, 0);
  114.         testFFT(size, 1);
  115.         size *= 2;
  116.         if (size > MAX_FFT_SIZE) break;
  117.     }
  118.     printf("test end\n");
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment