chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用Arduino UNO實(shí)現(xiàn)DTMF解碼器

454398 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2019-11-25 15:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

步驟1:了解算法

如何用Arduino UNO實(shí)現(xiàn)DTMF解碼器

在DTMF中,每個(gè)符號(hào)根據(jù)圖片上的表格使用兩個(gè)頻率進(jìn)行編碼。

該設(shè)備捕獲麥克風(fēng)的輸入并計(jì)算八個(gè)頻率的幅度。具有最大幅度的兩個(gè)頻率給出了編碼符號(hào)的一行和一列。

數(shù)據(jù)采集

為了執(zhí)行頻譜分析,應(yīng)以某個(gè)可預(yù)測(cè)的頻率捕獲樣本。為了達(dá)到這個(gè)目的,我使用了具有最大精度的自由運(yùn)行ADC模式(預(yù)分頻器128),它提供了9615Hz的采樣率。下面的代碼顯示了如何配置ArduinoADC。

void initADC() {

// Init ADC; f = ( 16MHz/prescaler ) / 13 cycles/conversion

ADMUX = 0; // Channel sel, right-adj, use AREF pin

ADCSRA = _BV(ADEN) | // ADC enable

_BV(ADSC) | // ADC start

_BV(ADATE) | // Auto trigger

_BV(ADIE) | // Interrupt enable

_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // 128:1 / 13 = 9615 Hz

ADCSRB = 0; // Free-run mode

DIDR0 = _BV(0); // Turn off digital input for ADC pin

TIMSK0 = 0; // Timer0 off

}

And the interrupt handler looks like this

ISR(ADC_vect) {

uint16_t sample = ADC;samples[samplePos++] = sample - 400;

if(samplePos 》= N) {

ADCSRA &= ~_BV(ADIE); // Buffer full, interrupt off

}

}

頻譜分析

收集樣本后,我計(jì)算出8個(gè)頻率的幅度,這些頻率編碼符號(hào)。我不需要為此運(yùn)行完整的FFT,因此我使用了Goertzel的算法。

void goertzel(uint8_t *samples, float *spectrum) {

float v_0, v_1, v_2;

float re, im, amp;

for (uint8_t k = 0; k 《 IX_LEN; k++) {

float c = pgm_read_float(&(cos_t[k]));

float s = pgm_read_float(&(sin_t[k]));

float a = 2. * c;

v_0 = v_1 = v_2 = 0;

for (uint16_t i = 0; i 《 N; i++) {

v_0 = v_1;

v_1 = v_2;

v_2 = (float)(samples[i]) + a * v_1 - v_0;

}

re = c * v_2 - v_1;

im = s * v_2;

amp = sqrt(re * re + im * im);

spectrum[k] = amp;

}

}

步驟2:代碼

上圖顯示了數(shù)字3的編碼示例,其中最大幅度對(duì)應(yīng)于697Hz和1477Hz頻率。

完整的草圖如下

/**

* Connections:

* [ Mic to Arduino ]

* - Out -》 A0

* - Vcc -》 3.3V

* - Gnd -》 Gnd

* - Arduino: AREF -》 3.3V

* [ Display to Arduino ]

* - Vcc -》 5V

* - Gnd -》 Gnd

* - DIN -》 D11

* - CLK -》 D13

* - CS -》 D9

*/

#include

#include

#include

#define CS_PIN 9

#define N 256

#define IX_LEN 8

#define THRESHOLD 20

LEDMatrixDriver lmd(1, CS_PIN);

uint8_t samples[N];

volatile uint16_t samplePos = 0;

float spectrum[IX_LEN];

// Frequences [697.0, 770.0, 852.0, 941.0, 1209.0, 1336.0, 1477.0, 1633.0]

// Calculated for 9615Hz 256 samples

const float cos_t[IX_LEN] PROGMEM = {

0.8932243011955153, 0.8700869911087115, 0.8448535652497071, 0.8032075314806449,

0.6895405447370669, 0.6343932841636456, 0.5555702330196023, 0.4713967368259978

};

const float sin_t[IX_LEN] PROGMEM = {

0.44961132965460654, 0.49289819222978404, 0.5349976198870972, 0.5956993044924334,

0.7242470829514669, 0.7730104533627369, 0.8314696123025451, 0.8819212643483549

};

typedef struct {

char digit;

uint8_t index;

} digit_t;

digit_t detected_digit;

const char table[4][4] PROGMEM = {

{‘1’, ‘2’, ‘3’, ‘A’},

{‘4’, ‘5’, ‘6’, ‘B’},

{‘7’, ‘8’, ‘9’, ‘C’},

{‘*’, ‘0’, ‘#’, ‘D’}

};

const uint8_t char_indexes[4][4] PROGMEM = {

{1, 2, 3, 10},

{4, 5, 6, 11},

{7, 8, 9, 12},

{15, 0, 14, 13}

};

byte font[16][8] = {

{0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x38}, // 0

{0x04,0x0c,0x14,0x24,0x04,0x04,0x04,0x04}, // 1

{0x00,0x30,0x48,0x04,0x04,0x38,0x40,0x7c}, // 2

{0x00,0x38,0x04,0x04,0x18,0x04,0x44,0x38}, // 3

{0x00,0x04,0x0c,0x14,0x24,0x7e,0x04,0x04}, // 4

{0x00,0x7c,0x40,0x40,0x78,0x04,0x04,0x38}, // 5

{0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38}, // 6

{0x00,0x7c,0x04,0x04,0x08,0x08,0x10,0x10}, // 7

{0x00,0x3c,0x44,0x44,0x38,0x44,0x44,0x78}, // 8

{0x00,0x38,0x44,0x44,0x3c,0x04,0x04,0x78}, // 9

{0x00,0x1c,0x22,0x42,0x42,0x7e,0x42,0x42}, // A

{0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x7c}, // B

{0x00,0x3c,0x44,0x40,0x40,0x40,0x44,0x7c}, // C

{0x00,0x7c,0x42,0x42,0x42,0x42,0x44,0x78}, // D

{0x00,0x0a,0x7f,0x14,0x28,0xfe,0x50,0x00}, // #

{0x00,0x10,0x54,0x38,0x10,0x38,0x54,0x10} // *

};

void initADC() {

// Init ADC; f = ( 16MHz/prescaler ) / 13 cycles/conversion

ADMUX = 0; // Channel sel, right-adj, use AREF pin

ADCSRA = _BV(ADEN) | // ADC enable

_BV(ADSC) | // ADC start

_BV(ADATE) | // Auto trigger

_BV(ADIE) | // Interrupt enable

_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // 128:1 / 13 = 9615 Hz

ADCSRB = 0; // Free-run mode

DIDR0 = _BV(0); // Turn off digital input for ADC pin

TIMSK0 = 0; // Timer0 off

}

void goertzel(uint8_t *samples, float *spectrum) {

float v_0, v_1, v_2;

float re, im, amp;

for (uint8_t k = 0; k 《 IX_LEN; k++) {

float c = pgm_read_float(&(cos_t[k]));

float s = pgm_read_float(&(sin_t[k]));

float a = 2. * c;

v_0 = v_1 = v_2 = 0;

for (uint16_t i = 0; i 《 N; i++) {

v_0 = v_1;

v_1 = v_2;

v_2 = (float)(samples[i]) + a * v_1 - v_0;

}

re = c * v_2 - v_1;

im = s * v_2;

amp = sqrt(re * re + im * im);

spectrum[k] = amp;

}

}

float avg(float *a, uint16_t len) {

float result = .0;

for (uint16_t i = 0; i 《 len; i++) {

result += a[i];

}

return result / len;

}

int8_t get_single_index_above_threshold(float *a, uint16_t len, float threshold) {

if (threshold 《 THRESHOLD) {

return -1;

}

int8_t ix = -1;

for (uint16_t i = 0; i 《 len; i++) {

if (a[i] 》 threshold) {

if (ix == -1) {

ix = i;

} else {

return -1;

}

}

}

return ix;

}

void detect_digit(float *spectrum) {

float avg_row = avg(spectrum, 4);

float avg_col = avg(&spectrum[4], 4);

int8_t row = get_single_index_above_threshold(spectrum, 4, avg_row);

int8_t col = get_single_index_above_threshold(&spectrum[4], 4, avg_col);

if (row != -1 && col != -1 && avg_col 》 200) {

detected_digit.digit = pgm_read_byte(&(table[row][col]));

detected_digit.index = pgm_read_byte(&(char_indexes[row][col]));

} else {

detected_digit.digit = 0;

}

}

void drawSprite(byte* sprite) {

// The mask is used to get the column bit from the sprite row

byte mask = B10000000;

for(int iy = 0; iy 《 8; iy++ ) {

for(int ix = 0; ix 《 8; ix++ ) {

lmd.setPixel(7 - iy, ix, (bool)(sprite[iy] & mask ));

// shift the mask by one pixel to the right

mask = mask 》》 1;

}

// reset column mask

mask = B10000000;

}

}

void setup() {

cli();

initADC();

sei();

Serial.begin(115200);

lmd.setEnabled(true);

lmd.setIntensity(2);

lmd.clear();

lmd.display();

detected_digit.digit = 0;

}

unsigned long z = 0;

void loop() {

while(ADCSRA & _BV(ADIE)); // Wait for audio sampling to finish

goertzel(samples, spectrum);

detect_digit(spectrum);

if (detected_digit.digit != 0) {

drawSprite(font[detected_digit.index]);

lmd.display();

}

if (z % 5 == 0) {

for (int i = 0; i 《 IX_LEN; i++) {

Serial.print(spectrum[i]);

Serial.print(“ ”);

}

Serial.println();

Serial.println((int)detected_digit.digit);

}

z++;

samplePos = 0;

ADCSRA |= _BV(ADIE); // Resume sampling interrupt

}

ISR(ADC_vect) {

uint16_t sample = ADC;

samples[samplePos++] = sample - 400;

if(samplePos 》= N) {

ADCSRA &= ~_BV(ADIE); // Buffer full, interrupt off

}

}

步驟3:原理圖

應(yīng)進(jìn)行以下連接:

麥克風(fēng)與Arduino

Out -》 A0

Vcc -》 3.3V

Gnd -》 Gnd

將AREF連接到3.3V很重要。

顯示到Arduino

Vcc -》 5V

Gnd -》 Gnd

DIN -》 D11

CLK -》 D13

CS -》 D9

步驟4:結(jié)論

這里可以改進(jìn)什么?我以9615Hz的速率使用N = 256個(gè)樣本,該速率有一些頻譜泄漏,如果N = 205且速率為8000Hz,則所需頻率與離散化網(wǎng)格重合。對(duì)于該ADC,應(yīng)在定時(shí)器溢出模式下使用。
責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 解碼器
    +關(guān)注

    關(guān)注

    9

    文章

    1199

    瀏覽量

    42559
  • DTMF
    +關(guān)注

    關(guān)注

    1

    文章

    74

    瀏覽量

    47922
  • Arduino
    +關(guān)注

    關(guān)注

    190

    文章

    6509

    瀏覽量

    194766
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Arduino UNO Q 登陸 DigiKey,現(xiàn)已開(kāi)放預(yù)訂

    融合高性能微處理與專用微控制,Arduino UNO Q加強(qiáng)創(chuàng)新開(kāi)發(fā)能力 美國(guó), 明尼蘇達(dá), 錫夫里弗福爾斯市 - 2025 年 10 月 07 日 全球領(lǐng)先的電子元器件與自動(dòng)化產(chǎn)
    的頭像 發(fā)表于 10-13 14:55 ?122次閱讀
    <b class='flag-5'>Arduino</b> <b class='flag-5'>UNO</b> Q 登陸 DigiKey,現(xiàn)已開(kāi)放預(yù)訂

    LM567C 音調(diào)解碼器技術(shù)手冊(cè)

    LM567 和 LM567C 是通用音調(diào)解碼器,設(shè)計(jì)用于在通帶內(nèi)存在輸入信號(hào)時(shí)提供飽和晶體管對(duì)地開(kāi)關(guān)。該電路由一個(gè) I 和 Q 檢測(cè)組成,該檢測(cè)由壓控振蕩驅(qū)動(dòng),該振蕩
    的頭像 發(fā)表于 09-24 10:00 ?359次閱讀
    LM567C 音調(diào)<b class='flag-5'>解碼器</b>技術(shù)手冊(cè)

    增強(qiáng)T-BOX設(shè)計(jì),新唐編解碼器的重要作用

    (工作電壓范圍:2.5V-5.5V),最大輸出功率可達(dá)1W。此外,通過(guò)軟件控制的內(nèi)部寄存可以實(shí)現(xiàn)靈活的省電模式。 主要優(yōu)勢(shì):T-BOX設(shè)計(jì)架構(gòu)中的汽車級(jí)編解碼器 音頻編解碼器
    發(fā)表于 09-05 06:26

    何用Arduino Nano/UNO R3開(kāi)發(fā)板給另一個(gè)Arduino IDE不能下載的Arduino Nano/UNO R3開(kāi)發(fā)板重新燒錄引導(dǎo)程序bootlaoder

    本文介紹了如何用能夠Arduino IDE下載的Arduino Nano/UNO R3開(kāi)發(fā)板給另一個(gè)Arduino IDE不能下載的
    的頭像 發(fā)表于 08-08 20:16 ?2437次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Arduino</b> Nano/<b class='flag-5'>UNO</b> R3開(kāi)發(fā)板給另一個(gè)<b class='flag-5'>Arduino</b> IDE不能下載的<b class='flag-5'>Arduino</b> Nano/<b class='flag-5'>UNO</b> R3開(kāi)發(fā)板重新燒錄引導(dǎo)程序bootlaoder

    解碼器的 0.02-4.0 GHz 高隔離 SP4T 吸收開(kāi)關(guān) skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()帶解碼器的 0.02-4.0 GHz 高隔離 SP4T 吸收開(kāi)關(guān)相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有帶解碼器的 0.02-4.0 GHz 高隔離 SP4T 吸收開(kāi)關(guān)的引腳圖、接線圖
    發(fā)表于 08-08 18:33
    帶<b class='flag-5'>解碼器</b>的 0.02-4.0 GHz 高隔離 SP4T 吸收開(kāi)關(guān) skyworksinc

    0.1-2.7 GHz SP4T 開(kāi)關(guān),帶集成邏輯解碼器 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()0.1-2.7 GHz SP4T 開(kāi)關(guān),帶集成邏輯解碼器相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有0.1-2.7 GHz SP4T 開(kāi)關(guān),帶集成邏輯解碼器的引腳圖、接線圖、封裝手冊(cè)、中文
    發(fā)表于 08-08 18:32
    0.1-2.7 GHz SP4T 開(kāi)關(guān),帶集成邏輯<b class='flag-5'>解碼器</b> skyworksinc

    解碼器的 20 MHz-3.0 GHz 高功率 SP4T 開(kāi)關(guān) skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()帶解碼器的 20 MHz-3.0 GHz 高功率 SP4T 開(kāi)關(guān)相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有帶解碼器的 20 MHz-3.0 GHz 高功率 SP4T 開(kāi)關(guān)的引腳圖、接線圖
    發(fā)表于 08-08 18:32
    帶<b class='flag-5'>解碼器</b>的 20 MHz-3.0 GHz 高功率 SP4T 開(kāi)關(guān) skyworksinc

    0.25 - 2.15 GHz 4x2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓解碼器 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()0.25 - 2.15 GHz 4x2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓解碼器相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有0.25 - 2.15 GHz 4x2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓解碼器的引腳圖
    發(fā)表于 08-07 18:35
    0.25 - 2.15 GHz 4x2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓<b class='flag-5'>解碼器</b> skyworksinc

    4 x 2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓解碼器 250 MHz–2.15 GHz skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()4 x 2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓解碼器 250 MHz–2.15 GHz相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有4 x 2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓解碼器 250 MHz–2.15
    發(fā)表于 08-06 18:30
    4 x 2 開(kāi)關(guān)矩陣,帶音調(diào)/電壓<b class='flag-5'>解碼器</b> 250 MHz–2.15 GHz skyworksinc

    OT82111_VC1:USB OTG音頻解碼器固件技術(shù)解析

    引言隨著移動(dòng)設(shè)備對(duì)高品質(zhì)音頻輸出的需求不斷提升,支持USBOTG和I2S輸出的音頻解碼器成為便攜音頻領(lǐng)域的重要解決方案。本文將介紹一款專為移動(dòng)設(shè)備設(shè)計(jì)、具備ASRC采樣率轉(zhuǎn)換功能的USBOTG音頻
    的頭像 發(fā)表于 07-25 15:23 ?400次閱讀
    OT82111_VC1:USB OTG音頻<b class='flag-5'>解碼器</b>固件技術(shù)解析

    CYW20721內(nèi)置的所有編解碼器類型有哪些?

    您能告訴我們 CYW20721 內(nèi)置的所有編解碼器類型嗎? LDAC、LC3(LE 音頻)、AAC、SBC 等。
    發(fā)表于 06-27 08:03

    Transformer架構(gòu)中解碼器的工作流程

    解碼器的作用主要是制作文本序列。與編碼類似,解碼器也配備了一組類似的子層。它具有兩個(gè)Multi-Head attention層,一個(gè)點(diǎn)前饋層,并且在每個(gè)子層之后都包含剩余連接和層歸一化。
    的頭像 發(fā)表于 06-10 14:32 ?663次閱讀
    Transformer架構(gòu)中<b class='flag-5'>解碼器</b>的工作流程

    DM5885視頻解碼器英文手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《DM5885視頻解碼器英文手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 04-02 14:42 ?1次下載

    監(jiān)控網(wǎng)絡(luò)高清視頻解碼器,開(kāi)啟安防監(jiān)控新時(shí)代

    監(jiān)控網(wǎng)絡(luò)高清視頻解碼器,開(kāi)啟安防監(jiān)控新時(shí)代 在安防監(jiān)控領(lǐng)域,您是否還在為設(shè)備兼容性差、操作復(fù)雜、畫面顯示效果不佳而煩惱?現(xiàn)在,一款全新的監(jiān)控網(wǎng)絡(luò)高清視頻解碼器震撼登場(chǎng),為您徹底解決這些難題
    的頭像 發(fā)表于 02-20 14:59 ?1230次閱讀
    監(jiān)控網(wǎng)絡(luò)高清視頻<b class='flag-5'>解碼器</b>,開(kāi)啟安防監(jiān)控新時(shí)代

    深入了解山景藍(lán)牙音頻解碼器的工作原理以及應(yīng)用領(lǐng)域

    藍(lán)牙音頻解碼器是一種用于將數(shù)字音樂(lè)解碼成模擬聲音信號(hào)的裝置。藍(lán)牙解碼器現(xiàn)在被廣泛應(yīng)用于智能手機(jī)、平板電腦和電腦等數(shù)字音樂(lè)播放設(shè)備,能夠一定程度上提高音質(zhì),讓音樂(lè)更加高保真。
    的頭像 發(fā)表于 01-08 09:39 ?1730次閱讀
    深入了解山景藍(lán)牙音頻<b class='flag-5'>解碼器</b>的工作原理以及應(yīng)用領(lǐng)域