lazy 发表于 2019-2-23 12:11:32

如何获得音频的频率?

我想请教一下。我现在想测量一个乐器音调的准确频率,用audio analyzer音频分析模块可行么?它的说明是输出每个频段的幅值,应该不是我想要的。如果不可行的话,请教一下大家应该怎么做呢?谢谢。

fats114 发表于 2019-2-23 17:14:07

“Audio Analyzer 音频分析模块”是七段分频的,是给分频器用的,你需要的是“模拟声音传感器”

lazy 发表于 2019-2-23 20:10:26

fats114 发表于 2019-2-23 17:14
“Audio Analyzer 音频分析模块”是七段分频的,是给分频器用的,你需要的是“模拟声音传感器” ...

模拟声音传感器我也看了一下,它不是只用来测音量强度的么?

fats114 发表于 2019-2-24 22:39:08

lazy 发表于 2019-2-23 20:10
模拟声音传感器我也看了一下,它不是只用来测音量强度的么?

需要adc转换

lazy 发表于 2019-2-26 09:20:52

你好,能请详细说一下操作么,如何直接测得频率?谢谢

lazy 发表于 2019-2-26 09:23:33

fats114 发表于 2019-2-24 22:39
需要adc转换

你好,能请详细说一下操作么,如何直接测得频率?谢谢

fats114 发表于 2019-3-1 17:08:36

唉,谁让我这么懒。
以arduino为例,一个麦克风来简单说一下怎么测声音频率。本人不才,误差大致是±5%,实际精度玩玩还行。输出的结果有:频率,占空比,周期,高电平时间,低电平时间。功能简单,基本满足你的需求可以用来粗略的调音,即只能测量单频,复合波形类似和弦就不行了。如果要提高效率,建议加入FFT库处理。
    /*
    Arduino Frequency meter
    */
    int divider = {0, 1, 8, 64, 256, 1024};
    int prescaler = 5;
    double count = 0;
    double middle = 0;
    char x = 0;
    ISR(TIMER1_OVF_vect)
    {
      if (prescaler < 4)
      {
            prescaler++;
      }
    }
    void interrupt()
    {
      if (!x)
      {
            count = TCNT1;
            TCNT1 = 0x000;
            TCCR1B = prescaler;
            attachInterrupt(0, interrupt, FALLING);
      }
      else
      {
            middle = TCNT1;
            attachInterrupt(0, interrupt, RISING);
      }
      x = ~x;
    }
    void setup()
    {
      Serial.begin(57600);
      TIMSK1 = 0x01;
      TCCR1A = 0x00;
      attachInterrupt(0, interrupt, RISING);
    }
    void loop()
    {
      Serial.print("Freq: ");
      Serial.print(16000000.0 / divider / count);
      Serial.print(" Hz                Duty: ");
      Serial.print(middle / count * 100);
      Serial.print(" %                Period: ");
      Serial.print(0.0000625 * divider*count);
      Serial.print(" ms                H-time: ");
      Serial.print(0.0000625 * divider*middle);
      Serial.print(" ms                L-time: ");
      Serial.print(0.0000625 * divider*(count - middle));
      Serial.println(" ms");
      if (prescaler > 1)
      {
            prescaler--;
            delay(200);
      }
      delay(100);
    }

麦克风接GND和D2口。 打开串口监视器,调波特率到57600,即可看到结果。因为没有任何防干扰措施,出现偏差特别大的结果请自行忽略。
页: [1]
查看完整版本: 如何获得音频的频率?