2016-09-17 56 views
0

麥克風或聲音會產生不同的電流。我想從原始音頻文件中提取這些信息。cpp原始音頻到模擬值

我得到來自麥克風的原始數據,用下面的命令:

arecord -t raw -f cd 

現在我想分析,以便從0V提取信號至5V的原始數據。但我不知道如何繼續。

我試了一下,但它是絕對不成功的,我覺得我離解決方案很遠。

#define BUFSIZE 8 

uint8_t analogRead() { 
    uint8_t buf[BUFSIZE]; 
    //cout << "analogRead" << endl; 
    read(STDIN_FILENO, buf, sizeof(buf)); 


    size_t size = sizeof(buf); 
    double accum = 0; 
    int const n_samples = size/2; 
    for (int i = 0; i < size; i += 2) 
    { 
     // put two bytes into one __signed__ integer 
     uint8_t val = buf[i] + ((uint8_t)buf[i+1] << 8); 

     accum += val*val; 
    } 
    accum /= n_samples; 

    cout << accum << endl; 

    return accum;  
} 

int main(int argc, char** argv) { 
    while(1) { 
     cout << analogRead() << endl; 
    } 

    return 0; 
} 

然後我跑我的測試是這樣的:

arecord -t raw -f cd | ./mytest 

回答

1

你的類型是所有的地方。模擬讀取被聲明爲返回一個uint8_t,但它在實際實現中會返回一個double。您似乎誤解了read()函數或sizeof運算符。第一個參數是正確的,它是文件descritpor。第二個參數是緩衝區也是正確的。第三個參數是緩衝區的大小。這不是由sizeof運營商獲得,而是使用BUFFER_SIZE*sizeof(uint8_t)

此外,你是命令行參數說輸出cd格式的音頻。 CD格式使用兩個音軌來創建立體聲效果,我們只對一個用於uspeech的音樂感興趣。如果你看一下手冊頁arecord它規定:

-f --format=FORMAT 
      Sample format 
      Recognized sample formats are: S8 U8 S16_LE S16_BE U16_LE U16_BE 
      S24_LE S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE FLOAT_LE 
      FLOAT_BE FLOAT64_LE FLOAT64_BE IEC958_SUBFRAME_LE IEC958_SUB- 
      FRAME_BE MU_LAW A_LAW IMA_ADPCM MPEG GSM 
      Some of these may not be available on selected hardware 
      There are also two format shortcuts available: 
      -f cd (16 bit little endian, 44100, stereo [-f S16_LE -c2 -r44100] 
      -f dat (16 bit little endian, 48000, stereo) [-f S16_LE -c2 -r48000] 
      If no format is given U8 is used. 

爲了簡單起見,你寧願-C1。你可以使用任何上述格式。既然你選擇了uint8_t,如果你使用了U8,那將是最簡單的。然後,你可以重寫你的模擬讀功能:

uint8_t analogRead() { 
     uint8_t buf[1]; //This will read 1 byte at a time. Its not efficient but its the closest you will get to analogRead() if you're thinking in arduino terms. 
     read(STDIN_FILENO, buf, 1); 
     return buf[0]; 
    } 

所以一旦你解決它,那麼你使用的程序一樣

arecord -t raw -f u8 -c 1 | ./mytest