Анализатор спектра – это измерительное оборудование, которое для проведения анализа спектра использует быстрое преобразование Фурье (FFT — Fast Fourier Transform). Осуществление анализа Фурье возможно в случаях, когда непрерывный временной интервал может быть преобразован в непрерывный частотный интервал, в котором будет содержаться информация об амплитудах и фазах частотных компонентов.
Представленный в данной статье анализатор спектра звуковых частот построен на основе платы Arduino. Устройство состоит из сравнительно небольшого числа компонентов.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- ЖК дисплей с разрешением 128х64 пикселов (ST7920 128×64 LCD) (купить на AliExpress).
- Резистор 10 кОм (2 шт.) (купить на AliExpress).
- Однооборотный потенциометр 10 кОм (single-turn potentiometer) (купить на AliExpress).
- Конденсатор 1 мкФ (купить на AliExpress).
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Если вы раньше не работали с графическим дисплеем, используемом в данном проекте, то на нашем сайте вы можете прочитать статью про подключение графического ЖК дисплея ST7920 к плате Arduino.
Работа схемы
Схема анализатора спектра звуковых частот на основе платы Arduino представлена на следующем рисунке.
Код программы использует библиотеку «fix_fft», которая предназначена для анализа спектра сигналов с помощью быстрого преобразования Фурье (БПФ).
Собранную конструкцию проекта мы упаковали в удобную коробку. Данный анализатор спектра нельзя назвать профессиональным инструментом поскольку он имеет низкое разрешение и частотный диапазон, но для образовательных целей он подойдет отлично.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#include "U8glib.h" #include "fix_fft.h" // LCD SPI SCK-EN, MOSI-RW & SS-CS #define EN 6 #define RW 5 #define CS 4 // display set up, bar, line position L & R #define LINEY 50 #define LINEXL 0 #define LINEXR 128 #define SAMPLES 128 #define AUDIO A0 U8GLIB_ST7920_128X64_1X lcd(EN, RW, CS); // serial use, PSB = GND char im[SAMPLES]; char data[SAMPLES]; int barht[SAMPLES]; void setup() { lcd.begin(); // inti display } void loop() { static int i, j; int val; // get audio data for(i = 0; i < SAMPLES; i++) { val = analogRead(AUDIO); // 0-1023 data[i] = (char)(val/4 - 128); // store as char im[i] = 0; // init all as 0 } // run FFT fix_fft(data, im, 7, 0); // extract absolute value of data only, for 64 results for(i = 0; i < SAMPLES/2; i++) { barht[i] = (int)sqrt(data[i] * data[i] + im[i] * im[i]); } for(i = 0, j = 0; i < SAMPLES/2; i++, j += 2) { barht[i] = barht[j] + barht[j + 1]; } // display barchart barchart(SAMPLES/4, barht); // plot SAMPLES / 4 = 32 as barchart gen cannot handle 128 bars } // plot line and bar at position and height void barchart(int n, int bh[]) { int i, s, w; // bars, spacing and width s = (LINEXR - LINEXL) / n; w = s / 2; lcd.firstPage(); do { lcd.setFont(u8g_font_helvR08); lcd.drawStr(20, 10, "FFT Audio Spectrum"); lcd.drawLine(LINEXL, LINEY, LINEXR, LINEY); lcd.drawStr(0, LINEY + 10, "0"); lcd.drawStr(29, LINEY + 10, "1k"); lcd.drawStr(59, LINEY + 10, "2k"); lcd.drawStr(91, LINEY + 10, "3k"); lcd.drawStr(115, LINEY + 10, "Hz"); for(i = 0; i < n; i++) { lcd.drawBox(LINEXL + s * i, LINEY - bh[i], w, bh[i] + 1); // u8glib doesn't accept box height of 0 } }while(lcd.nextPage()); } |
Видео, демонстрирующее работу анализатора спектра
На видео представлен анализ нескольких различных видов сигналов с помощью спроектированного анализатора спектра.
При синусоидальном входном сигнале несущую хорошо видно и если частота входного сигнала изменяется, то положение несущей на экране анализатора также смещается.
При подаче на вход сигнала прямоугольных импульсов на экране анализатора хорошо виден основной сигнал, а также три нечетные гармоники — x3, x5 & x7.
Если же мы подадим на вход анализатора аудио сигнал, то мы увидим на экране его спектр.
2 ответа к “Анализатор спектра звуковых частот на основе FFT и Arduino”
Большое спасибо за перевод отличного проекта!
Спасибо и вам что оценили мой труд