2019-2-23 12:11:32 [显示全部楼层]
3874浏览
查看: 3874|回复: 6

[常见问题] 如何获得音频的频率?

[复制链接]
我想请教一下。我现在想测量一个乐器音调的准确频率,用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-3-1 17:08:36

唉,谁让我这么懒。
以arduino为例,一个麦克风来简单说一下怎么测声音频率。本人不才,误差大致是±5%,实际精度玩玩还行。输出的结果有:频率,占空比,周期,高电平时间,低电平时间。功能简单,基本满足你的需求可以用来粗略的调音,即只能测量单频,复合波形类似和弦就不行了。如果要提高效率,建议加入FFT库处理。
    /*
    Arduino Frequency meter
    */
    int divider[6] = {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[prescaler] / count);
        Serial.print(" Hz                Duty: ");
        Serial.print(middle / count * 100);
        Serial.print(" %                Period: ");
        Serial.print(0.0000625 * divider[prescaler]*count);
        Serial.print(" ms                H-time: ");
        Serial.print(0.0000625 * divider[prescaler]*middle);
        Serial.print(" ms                L-time: ");
        Serial.print(0.0000625 * divider[prescaler]*(count - middle));
        Serial.println(" ms");
        if (prescaler > 1)
        {
            prescaler--;
            delay(200);
        }
        delay(100);
    }

麦克风接GND和D2口。 打开串口监视器,调波特率到57600,即可看到结果。因为没有任何防干扰措施,出现偏差特别大的结果请自行忽略。
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail