25 #include "avr_helper.h" 26 #include <avr/pgmspace.h> 27 #include <avr/interrupt.h> 29 #include <avr/eeprom.h> 35 #if defined(DOUBLE_BUFFERED_SAMPLING) 36 #define FFT_BUFFER_SIZE (FFT_N * 2L) 38 #define FFT_BUFFER_SIZE FFT_N 42 static complex_t buffer_fft_a[FFT_BUFFER_SIZE];
43 #if defined(DOUBLE_BUFFERED_SAMPLING) 44 static complex_t *buffer_fft_b = buffer_fft_a + FFT_N;
47 static complex_t *buf_out = buffer_fft_a + FFT_N;
49 static complex_t *buf_in = buffer_fft_a;
60 if(*size > (FFT_BUFFER_SIZE*
sizeof(complex_t)))
61 *size = (FFT_BUFFER_SIZE*
sizeof(complex_t));
66 static __flash
const int16_t *window_ptr = tbl32_window;
68 static volatile uint8_t adc_count;
70 #if defined(_FFT_DEBUG_) 79 #if defined(_FFT_DEBUG_) 82 int16_t v = ADC - cfg.dc_offset;
84 v = fmuls_f(v, *window_ptr);
109 SFIOR = _BV(ADTS1) | _BV(ADTS0);
111 ADCSRA = _BV(ADEN) | _BV(ADIE) | _BV(ADATE) | ADC_DIV_32;
113 ADMUX = _BV(ADLAR) | ADC_REF_AVCC;
125 static uint8_t buf_id;
127 #if defined(DOUBLE_BUFFERED_SAMPLING) 133 buf_in = buffer_fft_b;
134 buf_out = buffer_fft_a;
136 buf_in = buffer_fft_a;
137 buf_out = buffer_fft_b;
140 buf_in = buffer_fft_a;
146 window_ptr = tbl32_window;
149 TCCR0 = _BV(WGM01) | TIMER_CLK_DIV_8;
151 #if !defined(DOUBLE_BUFFERED_SAMPLING) 154 fft32_execute(buffer_fft_a);
157 fft32_execute(buf_out);
168 __flash
const int16_t *revers = tbl32_bitrev;
175 fsqrt(buf_out[ix].r,buf_out[ix].i)
177 fsqrt(buffer_fft_a[ix].r,buffer_fft_a[ix].i)
#define ADC_PIN
номер пина порта АЦП для входного сигнала
void sample_and_fft(void)
Захват семплов и обработка методом FFT.
uint16_t get_result_fft(uint8_t index)
получение запрошенной гармоники FFT.
Описания для модуля реализации спектрального анализа
Аппаратно-зависимые определения
#define DOUBLE_BUFFERED_SAMPLING
#define ADC_PORT
символ порта АЦП
void * get_reserved_memory(uint16_t *size)
запрос резервной памяти