Обнаружение пиковой частоты в выходном сигнале микрофона

Я использую простой электродный микрофон с платой Arduino UNO для определения пиковых частот в выходном сигнале с течением времени. Я установил частоту дискретизации на 1 МГц, но не могу уловить пик выше 4000 Гц (я проверил значения с помощью регрессии, но это верно только для диапазона [200 Гц, 3900 Гц]). Итак, мои вопросы:

  • Это связано с чувствительностью микрофона или с Arduino UNO?
  • Кто-то предложил мне ESP32, но я не понимаю, какая разница.

КОД:

#include "arduinoFFT.h"
float peak = 0;
float val = 0;
#define SAMPLES 128            //ОБРАЗЦЫ-pt FFT. Должно быть числом с основанием 2. Макс 128 для Arduino Uno.
#define SAMPLING_FREQUENCY 1000000 //Ts = На основе Найквиста, должна быть в 2 раза выше максимальной ожидаемой частоты.
 
arduinoFFT FFT = arduinoFFT();
 
unsigned int samplingPeriod;
unsigned long microSeconds;
 
double vReal[SAMPLES]; //создаем вектор размера SAMPLES для хранения реальных значений
double vImag[SAMPLES]; //создаем вектор размера SAMPLES для хранения мнимых значений
 
void setup() 
{
    Serial.begin(115200); 
    samplingPeriod = round(1000000*(1.0/SAMPLING_FREQUENCY)); // Период в микросекундах
    
}
 
void loop() 
{  
    
    for(int i=0; i<SAMPLES; i++)
    {
        microSeconds = micros();   
        val = analogRead(0);
        vReal[i] = val; 
        vImag[i] = 0; 

       
        while(micros() < (microSeconds + samplingPeriod))
        {
          
        }
    }
 
    
    FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
    FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
    FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);

    
    peak = FFT.MajorPeak(vReal, SAMPLES, SAMPLING_FREQUENCY);
    Serial.println((peak-5063)/122.5); 
    Serial.print(";");

 

, 👍0

Обсуждение

Я использовал прилагаемую библиотеку FFT и генерировал звуки с помощью приложения, а затем проверял измеренные частоты с помощью приложения Spectroid, хотя мне пришлось поместить источник прямо у микрофона., @أيمن الفحصي

Связанный: https://arduinoprosto.ru/q/44868/max-sample-rate-of-an-arduino-uno, @chrisl

Я сомневаюсь, что у вас действительно есть частота дискретизации АЦП 1 МГц на Arduino Uno. Кажется, что 4 кГц соответствует удвоенной максимальной частоте дискретизации в первом комментарии к этому вопросу (частота Никвиста). ESP32, безусловно, был предложен, потому что он работает на гораздо более высоких тактовых частотах. У меня по умолчанию установлено значение 240 МГц (в отличие от Unos 16 МГц). Пожалуйста, покажите нам свой код, @chrisl

вот мой код:, @أيمن الفحصي

пожалуйста, проверьте вопрос, @أيمن الفحصي

Если вы пишете большие целочисленные литералы, убедитесь, что они интерпретируются как «длинные». Так что пишите «1000000L» вместо «1000000». Затем повторите попытку. Также вы можете использовать micros() для измерения времени, которое действительно необходимо вашему циклу измерения. Это позволит убедиться, что вы на самом деле не медленнее с выборкой, чем вы думаете., @chrisl

Итак, вы думаете, что теперь можно обойтись покупкой другой, более точной карты?, @أيمن الفحصي

хорошо, я попробую это. Спасибо., @أيمن الفحصي

поэтому я попробовал тип длинного целого числа, но совершенно очевидно, что частота дискретизации UNO не подходит для этой работы. Есть ли карты лучше ардуино? Меня интересует только звуковой бренд, чтобы предложить устройство, которое предупреждает о преобладании частот при высокой интенсивности., @أيمن الفحصي

Существует всего несколько плат Arduino, которые медленнее, чем Uno. Так что смотрите, что доступно для вас и проверяйте тактовую частоту. Изучите максимальную частоту дискретизации АЦП для этих плат. Тогда вы можете выбрать один. ESP32 — это только одна возможность., @chrisl

Здравствуйте. Выход моего микрофона слишком низкий. При измерении диапазона (макс. - мин.) моего сигнала (который я буду использовать позже) диапазон всегда составляет около 2, и мне нужно очень громко кашлять и близко к микрофону, чтобы он изменился. Усиление неизбежно? Потому что в моем микрофоне уже был встроенный усилитель?, @أيمن الفحصي

Вам нужно напряжение между землей и Vcc вашей платы (5 В на Uno, 3,3 В на таких платах, как ESP32). Если ваш микрофонный модуль этого не обеспечивает, вам нужно дополнительное усиление., @chrisl

когда я звучу достаточно громко, размах сигнала может достигать 2 вольт, поэтому я думаю, что встроенный усилитель достаточно хорош., @أيمن الفحصي