一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

【源碼】【wav音頻解析】之wavread的C 實(shí)現(xiàn)

 霞客書齋 2018-03-18
我在實(shí)現(xiàn)一個(gè)音頻處理功能的過程中,需要對wav文件進(jìn)行處理。我們知道在matlab中有現(xiàn)成的函數(shù)wavread('wavtest.wav'),本文的用途就是用c++代碼實(shí)現(xiàn)該函數(shù)的功能。
讀者可以在vs中新建一個(gè)工程,再將本文的代碼粘貼在文件中,編譯運(yùn)行:生成 —>編譯 —>生成wavread(U),打開vs工程目錄,例如我的是我的文檔/Visual Studio 2013/Projects/wavread,打開該目錄下的Debug文件夾,雙擊wavread.exe則可以看到下圖2所示的內(nèi)容。
輸入:wave.wav,你可以選擇你的wav文件目錄打開
輸出:如下圖2所示
更多實(shí)現(xiàn)原理,請您移步我的博文:http://my.oschina.net/liusicong/blog/323090


[1].[文件] wavread.cpp ~ 3KB    下載(249)

跳至 [1] [2]

#include <iostream>
#include <fstream>
#include <string.h>
#include<math.h>
#include<cmath>
#include<stdlib.h>
#include <bitset>
#include <iomanip>
//要在int main()的前面加上函數(shù)的聲明,因?yàn)槟愕暮瘮?shù)寫在main函數(shù)的后面
int hex_char_value(char ss);
int hex_to_decimal(const char* s);
//string hex_to_binary(char* szHex);
using namespace std;
 
struct wav_struct
{
    unsigned long file_size;        //文件大小
    unsigned short channel;            //通道數(shù)
    unsigned long frequency;        //采樣頻率
    unsigned long Bps;                //Byte率
    unsigned short sample_num_bit;    //一個(gè)樣本的位數(shù)
    unsigned long data_size;        //數(shù)據(jù)大小
    unsigned char *data;            //音頻數(shù)據(jù) ,這里要定義什么就看樣本位數(shù)了,我這里只是單純的復(fù)制數(shù)據(jù)
};
 
int main(int argc, char **argv)
{
    fstream fs;
    wav_struct WAV;
     
    fs.open("F:\\wave.wav", ios::binary | ios::in);
 
    //    fs.seekg(0x04);                //從文件數(shù)據(jù)中獲取文件大小
    //    fs.read((char*)&WAV.file_size,sizeof(WAV.file_size));
    //    WAV.file_size+=8;
 
    fs.seekg(0, ios::end);        //用c++常用方法獲得文件大小
    WAV.file_size = fs.tellg();
 
    fs.seekg(0x14);
    fs.read((char*)&WAV.channel, sizeof(WAV.channel));
 
    fs.seekg(0x18);
    fs.read((char*)&WAV.frequency, sizeof(WAV.frequency));
 
    fs.seekg(0x1c);
    fs.read((char*)&WAV.Bps, sizeof(WAV.Bps));
 
    fs.seekg(0x22);
    fs.read((char*)&WAV.sample_num_bit, sizeof(WAV.sample_num_bit));
 
    fs.seekg(0x28);
    fs.read((char*)&WAV.data_size, sizeof(WAV.data_size));
 
    WAV.data = new unsigned char[WAV.data_size];
     
 
    fs.seekg(0x2c);
    fs.read((char *)WAV.data, sizeof(char)*WAV.data_size);
 
    cout << "文件大小為  :" << WAV.file_size << endl;
    cout << "音頻通道數(shù)  :" << WAV.channel << endl;
    cout << "采樣頻率    :" << WAV.frequency << endl;
    cout << "Byte率      :" << WAV.Bps << endl;
    cout << "樣本位數(shù)    :" << WAV.sample_num_bit << endl;
    cout << "音頻數(shù)據(jù)大?。? << WAV.data_size << endl;
    cout << "最后10個(gè)數(shù)據(jù):" << endl;
 
    for (unsigned long i =0; i<WAV.data_size; i = i + 2)
    {       
        //右邊為大端
        unsigned long data_low = WAV.data[i];
        unsigned long data_high = WAV.data[i + 1];
        double data_true = data_high * 256 + data_low;
        //printf("%d ",data_true);
        long data_complement = 0;       
        //取大端的最高位(符號(hào)位)
        int my_sign = (int)(data_high / 128);
        //printf("%d ", my_sign);
        if (my_sign == 1)
        {
            data_complement = data_true - 65536;
        }
        else
        {
            data_complement = data_true;
        }
        //printf("%d ", data_complement);
        setprecision(4);
        double float_data = (double)(data_complement/(double)32768);    
        printf("%f ", float_data);
 
        //data_normalization[i] = (char)float_data;
        //printf("%f ", data_normalization[i]);     
        //bitset<8>lsc_high(data_high);
        //string high_binary = lsc_high.to_string();        
        //bitset<8> low_binary (low_data);            
    }
    fs.close();
 
    delete[] WAV.data;
    system("pause");
 
}
int hex_char_value(char c)
{
    if (c >= '0' && c <= '9')
        return c - '0';
    else if (c >= 'a' && c <= 'f')
        return (c - 'a' + 10);
    else if (c >= 'A' && c <= 'F')
        return (c - 'A' + 10);
    //assert(0);
    return 0;
}
int hex_to_decimal(char* szHex)
{
    int len = 2;
    int result = 0;
    for (int i = 0; i < len; i++)
    {
        result += (int)pow((float)16, (int)len - i - 1) * hex_char_value(szHex[i]);
    }
    return result;
}
/*
string hex_to_binary(char* szHex)
{
    int len = 2;
    string result;
    for (int i = 0; i < len;i++)
}
*/
[2].[圖片] QQ截圖20140929094252.png 跳至 [1] [2]

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精品国产一区二区欧美| 国产一区麻豆水好多高潮| 欧美日韩国产黑人一区| 日本人妻中出在线观看| 亚洲黄片在线免费小视频| 国产免费无遮挡精品视频| 午夜福利大片亚洲一区| 亚洲午夜精品视频观看| 国产在线视频好看不卡| 欧美一级黄片免费视频| 日本特黄特色大片免费观看| 国产一区二区三区午夜精品| 亚洲国产成人精品一区刚刚| 一区二区在线激情视频| 国产一区二区三区av在线| 国产成人免费激情视频| 黑色丝袜脚足国产一区二区| 正在播放国产又粗又长| 免费大片黄在线观看日本| 黄色片一区二区在线观看| 99热在线精品视频观看| 国产欧美日韩在线一区二区| 日本妇女高清一区二区三区| 欧美日韩人妻中文一区二区| 日本高清一区免费不卡| 久久国产精品热爱视频| 日韩精品视频香蕉视频| 丁香七月啪啪激情综合| 五月婷日韩中文字幕四虎| 国产精品久久男人的天堂| 国产一区欧美一区日韩一区| 欧美日韩欧美国产另类| 亚洲精品高清国产一线久久| 一区二区不卡免费观看免费| 在线观看视频成人午夜| 欧美大黄片在线免费观看| 日韩精品一区二区三区射精 | 五月情婷婷综合激情综合狠狠| 亚洲男人的天堂色偷偷| 精品女同一区二区三区| 亚洲天堂国产精品久久精品|