Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. #include <fix_fft.h> //dolaczenie biblioteki z algorytmem fix_fft
  2. const float pi = 3.14159; //deklaracja stałej PI do obliczen
  3. const int N = 8; // określenie rozmiaru okna potęgą liczby 2
  4. const int rozmiar_okna = 1 << N; //deklaracja parametru rozmiaru okna 1 << N = 2^N - przesun bit o N w prawo
  5. float fHann[rozmiar_okna]; //inicjalizacja funkcji okna
  6. char sample[rozmiar_okna]; //inicjalizacja buforu próbek - czesc rzeczywista
  7. char sample_im[rozmiar_okna]; //inicjalizacja buforu próbek - czesc urojona
  8.  
  9. //const int wysokosc_kolumny[8] = {251 , 247 , 254 , 253 , 191 , 127 , 239 , 223}; // tabela wartosci uzywanych do wyswietlenia wysokosci kolumny LED (tylko szczyt)
  10. const int wys_kol[8] = {251 , 243 , 242 , 240 , 176 , 48 , 32 , 0}; // tabela wartosci uzywanych do wyswietlenia wysokosci kolumny LED (kolumna wypelniona)
  11. // tylko do odczytu (const int)
  12.  
  13. int wartosc_kolumny[8]; //tablica uzywana do obslugi wysokosci kolumny
  14. int k; //globalna zmienna do czytania wartosc_kolumny w obsludze przerwan
  15.  
  16. void setup() {
  17.  
  18. //konfiguracja portów ARDUINO
  19.  
  20. DDRA |= B11111111; //ustaw caly port A jako OUTPUT, ukladowo sluzy jako sterowanie wysokoscia kolumny zerem 22 -> 29
  21. DDRC |= B11111111; //ustaw caly port C jako OUTPUT, ukladowo sluzy jako sterowanie zasilaniem kolumny jedynka 37 -> 30
  22.  
  23. // ustaw przerwania timer1 co 400 Hz
  24. TCCR1A = 0; // set entire TCCR1A register to 0
  25. TCCR1B = 0; // same for TCCR1B
  26. TCNT1 = 0; //initialize counter value to 0
  27.  
  28. // ustaw rejestr timer1 na zliczanie 400 Hz
  29. OCR1A = 39;// = (16*10^6) / (391*1024) - 1 ; 391*1024 ~ 400000
  30. TCCR1B |= (1 << WGM12); // wlacz tryb CTC - Clear Timer on Compare
  31. TCCR1B |= (1 << CS12) | (1 << CS10); // Ustaw bity CS10 i CS12 dla preskalera 1024
  32. TIMSK1 |= (1 << OCIE1A); // wlacz tryb timer compare interrupt
  33.  
  34. sei(); //zezwól na przerwania
  35. PORTC = 1; //zainicjuj stan portu C
  36.  
  37. for (int z = 0; z < rozmiar_okna; z++) { //generacja funkcji Hanna dla wybranego rozmiaru okna
  38.  
  39. fHann[z] = (sin((pi * z) / rozmiar_okna)) * (sin((pi * z) / rozmiar_okna));
  40.  
  41. }
  42.  
  43. }
  44.  
  45. void loop() {
  46.  
  47. //spróbkuj sygnał audio + naloz funkcje okna
  48. for (int c = 0; c < rozmiar_okna ; c++) {
  49. sample[c] = analogRead(A0) * fHann[c]; //okolo 30 ms
  50. sample_im[c] = 0;
  51. }
  52. //próbka gotowa do FFT
  53.  
  54. //wykonaj algorytm FFT z biblioteki fix_fft.h - nieznany czas trwania
  55. fix_fft(sample, sample_im, N, 0);
  56. //fix_fft(a , b , c , d)
  57. //a - tabela wartosci rzeczywistych [char]
  58. //b - tabela wartosci zespolonych [char]
  59. //c - rozmiar okna = 2^c [int]
  60. //d - kierunek FFT 0 - obliczanie widma , 1 - obliczanie sygnalu int
  61.  
  62. for (int d = 0; d < rozmiar_okna; d++) {
  63. sample[d] = sqrt(sample[d] * sample[d] + sample_im[d] * sample_im[d]); //oblicz wartosci skuteczne |z| = sqrt(Re*Re + Im*Im)
  64. } // sample[0 -> rozmiar_okna / 2] zawiera teraz wartosci skuteczne widma
  65. //przypisanie poszczegolnych wartosci sample[] jako wys_kol[0 - 7] do wartosc_kolumny :
  66. for (int e = 0; e < N; e++) {
  67. wartosc_kolumny[e] = wys_kol[(sample[1 << e]) / 128];
  68. }
  69. }
  70.  
  71. ISR(TIMER1_COMPA_vect) { //obsługa przerwania timer1 - timer1 compare interrupt service routine. Jedno przerwanie - jedno przesuniecie bitu sterowania kolumna
  72.  
  73. if (PORTC != B10000000) // jezeli PORTC jest rozny od 0 to :
  74. {
  75. PORTC = PORTC << 1; //przesun bit o jeden w lewo
  76. k++; //k = k + 1, przesun odczyt z wartosc_kolumny
  77. PORTA = wartosc_kolumny[k]; //wybierz wysokosc kolumny z tablicy
  78. }
  79. else {
  80. PORTC = B00000001; // jezeli PORTC jest rowny zero ustaw jedynke na osmy bit
  81. k = 0; //ustaw odczyt z wartosc_kolumny dla kolumny 1
  82. PORTA = wartosc_kolumny[k]; //wybierz wysokosc kolumny z tablicy
  83. }
  84.  
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement