Помогите понять код, FFT

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Daniyar, 21 май 2018.

  1. Daniyar

    Daniyar Нерд

    Хочу сделать мониторинг звука на частотах с 100 до 600 Гц, для этого использую LED матрицу 8x8 (4 шт), ардуино UNO, микрофон ky-037.

    #include <SPI.h>
    #include <Adafruit_GFX.h>
    #include <Max72xxPanel.h>
    #include <fix_fft.h>

    const int analogInPin = A0;// Аудиовход
    int sensorValue = 0;

    char im[128], data[128];// массив для входящего аудио сигнала
    char data_avgs[16];// массив для усредненных столбцов
    int i=0,val;

    int pinCS = 9;// пин лед матрицы
    int numberOfHorizontalDisplays = 4;// теперь у нас по-горизонтали 4 матриц
    int numberOfVerticalDisplays = 1;// теперь у нас по-вертикали 1 матриц

    Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
    //зачем нужна эта строка?

    void setup()
    {
    matrix.setIntensity(7); // яркость от 0 до 15
    Serial.begin(9600);// частота для входящего аудио сигнала?
    }

    void loop()
    {
    for (i=0; i < 128; i++)// Считываем значение с аналогового входа в массив
    {
    val = analogRead(analogInPin);
    data = val;
    im = 0;
    delay(0.1);(я добавил паузу, чтобы за время считывания прошло более 0.02 сек, иначе при быстром опросе мы можем потерять информацию о низких частотах(100 Гц)) Я прав?
    };

    fix_fft(data,im,8,0);// Преобразование Фурье, теперь у нас data перешла из временной области в частотную, но что означают эти параметры?
    Искал, нашел, понял лишь то, что последний параметр- прямое или обратное ПФ
    fix_fft() - perform forward/inverse fast Fourier transform.
    fr[n],fi[n] are real and imaginary arrays, both INPUT AND
    RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to
    0 for forward transform (FFT), or 1 for iFFT.


    for (i=0; i< 64;i++){
    data = sqrt(data * data + im * im); // Считаем и делаем значения положительными, можно без этого?
    };

    for (i=0; i<15; i++) {
    data_avgs =( data[i*4] + data[i*4 + 1] + data[i*4 + 2] + data[i*4 + 3])/4; // Считаем значение для каждого столбца частот
    }
    for (int x=0; x < 7; x++)// включаем светодиоды матричного индикатора(8х8)
    {
    for (int y=0; y < 7; y++) {
    if (y < data_avgs[8-x]) { // у ниже значения столбца
    matrix.drawPixel(x, y, HIGH); // зажигаем пиксель с координатами {x,y}
    matrix.write();
    delay(10);
    } else {
    matrix.drawPixel(x, y, LOW); // гасим пиксель
    matrix.write();
    delay(10);
    }
    }
    }
    delay(1000);
    }
    Получаем следующее: на матрице должна отображаться частотная...спектральная картина, которая обновляется каждые пару секунд.

    При проверке (включал тоновый звук на разных частотах, ожидал, что будет увеличиваться определенная полоса, но увеличивались либо все, либо ни одна. В чем ошибка?
     
  2. Daniyar

    Daniyar Нерд

    fix_fft() - perform forward/inverse fast Fourier transform.
    fr[n],fi[n] are real and imaginary arrays, both INPUT AND
    RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to
    0 for forward transform (FFT), or 1 for iFFT.

    intfix_fft(charfr[], charfi[], intm, intinverse);
     
  3. Daniil

    Daniil Гуру

    Инициализация матрицы. Тоже самое что и
    float sin45=sin(45*PI/180)
    Настройка последовательного порта. Подробности легко гуглятся.
    fft с наскоку не взять. На вопросы "можно" непонятно как отвечать. Можно) Надо читать про ффт и спектральный анализ.
     
  4. b707

    b707 Гуру

    при таком уровне вопросов - какой вам FFT????
    Вам бы сначала "Мама" научится выговаривать...
     
    parovoZZ нравится это.