日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS语音信号处理(1) C语言读取WAV语音文件文件头数据

發布時間:2024/8/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS语音信号处理(1) C语言读取WAV语音文件文件头数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

VS語音信號處理(1) C語言讀取WAV語音文件文件頭數據

  • 前言
  • 一. 工程實現
  • 二. 結果
  • 三. 小結

前言

語音識別相關算法一般在MATLAB上進行仿真驗證與實驗,在工程上一般還是在VS中進行實現落地,本系列將介紹語音信號處理在C語言中的一系列應用,后期將以此為基礎,再落地移植到嵌入式平臺。

語音文件的格式多種多樣都存在不同的標準,在WAV格式的語音文件中主要包含兩個部分:文件頭與語音數據,本文將介紹讀取WAV語音文件的文件頭數據。WAV格式語音文件數據標準如下圖所示。

即前44位位文件頭數據,44位之后為語音數據。

一. 工程實現

// ExtractData.h // 讀取wav格式語音文件文件頭數據 // date:2022-4-27 22:44:36 // author : C.S#ifndef _EXTRACTDATA_H_ #define _EXTRACTDATA_H_#include <stdint.h>typedef struct tagWAVHEADER {uint8_t ChunkID[4]; // 文檔標識。 大寫字符串"RIFF",標明該文件為有效的 RIFF 格式文檔。uint32_t ChunkSize; // 文件數據長度。 從下一個字段首地址開始到文件末尾的總字節數。該字段的數值加 8 為當前文件的實際長度。uint8_t Format[4]; // 文件格式類型。 所有 WAV 格式的文件此處為字符串"WAVE",標明該文件是 WAV 格式文件。uint8_t FmtChunkID[4]; // 格式塊標識。 小寫字符串,"fmt "。uint32_t FmtChunkSize; // 格式塊長度。 其數值不確定,取決于編碼格式。可以是 16、 18 、20、40 等。uint16_t AudioFormat; // 編碼格式代碼。 常見的 WAV 文件使用 PCM 脈沖編碼調制格式,該數值通常為 1。uint16_t NumChannels; // 聲道個數。 單聲道為 1,立體聲或雙聲道為 2。uint32_t SampleRate; // 采樣頻率。 每個聲道單位時間采樣次數。常用的采樣頻率有 11025, 22050 和 44100 kHz。uint32_t ByteRate; // 數據傳輸速率。 該數值為:聲道數×采樣頻率×每樣本的數據位數/8。播放軟件利用此值可以估計緩沖區的大小。uint16_t BlockAlign; // 數據塊對齊單位。 采樣幀大小。該數值為:聲道數×位數/8。播放軟件需要一次處理多個該值大小的字節數據,用該數值調整緩沖區。uint16_t BitsPerSample; // 采樣位數。 存儲每個采樣值所用的二進制數位數。常見的位數有 4、8、12、16、24、32。uint8_t DataChunkID[4];uint32_t DataChunkSize; } WAVHEADER;#endif // #ifndef _EXTRACTDATA_H_ // ExtractData.cpp // 讀取wav格式語音文件文件頭數據 // date:2022-4-27 22:44:36 // author : C.S#include <stdio.h> #include<iostream> #include<fstream> #include<stdlib.h> #include "ExtractData.h"#define W 128 //每次讀寫文件的數據量 int FileSet = 0; //定義一個整型變量, 用于保存fseek函數的返回值 int FileEnd = 0; //整個文件的字節數 int FileLength = 0; //文件的數據長度。(注:每2個字節作為一個數據 ) short InputData[W]; //文件讀寫數據緩沖區 WAVHEADER FileHeader; //存文件頭的結構體void showWavHead(WAVHEADER Header) {printf("ChunkID: %c%c%c%c\t", Header.ChunkID[0], Header.ChunkID[1], Header.ChunkID[2], Header.ChunkID[3]);printf("ChunkSize: %u\t", Header.ChunkSize);printf("Format: %c%c%c%c\n", Header.Format[0], Header.Format[1], Header.Format[2], Header.Format[3]);printf("FmtChunkID: %c%c%c%c\t", Header.FmtChunkID[0], Header.FmtChunkID[1], Header.FmtChunkID[2], Header.FmtChunkID[3]);printf("FmtChunkSize: %u\t", Header.FmtChunkSize);printf("AudioFormat: %d\t", Header.AudioFormat);printf("NumChannels: %d\t", Header.NumChannels);printf("SampleRate: %u\t", Header.SampleRate);printf("ByteRate: %u\t", Header.ByteRate);printf("BlockAlign: %d\t", Header.BlockAlign);printf("BitsPerSample: %d\n", Header.BitsPerSample);printf("DataChunkID: %c%c%c%c\t", Header.DataChunkID[0], Header.DataChunkID[1], Header.DataChunkID[2], Header.DataChunkID[3]);printf("DataChunkSize: %u\n", Header.DataChunkSize); }int main() {FILE *Ifp, *txt; //定義文件讀寫指針 Ifp = fopen("456.wav", "rb"); /*以只讀方式打開wav文件*/txt = fopen("456.txt", "w");/* 獲得文件字節數,fseek函數將文件內部指針指向文件末尾,ftell函數獲取文件內部指針相對于文件頭的偏移量,rewind函數將文件內部指針指向文件頭 */fseek(Ifp, 0L, SEEK_END);FileEnd = ftell(Ifp);printf("total file size: %d bytes \n", FileEnd);rewind(Ifp);// 讀取文件頭,并打印部分信息,wav格式的文件頭一般是44個字節,后面是音頻數據fread(&FileHeader, 1, sizeof(WAVHEADER), Ifp);showWavHead(FileHeader);// 讀取數據。這里的數據大小是2字節,按照實際格式改。while循環每次讀寫 W 個數據量,for循環寫最后剩余的FileLength = FileEnd / 2;while (FileLength >= W) {fread(InputData, sizeof(short), W, Ifp);for (int i = 0; i < W; i++) {fprintf(txt, "%d\n", InputData[i]);}FileLength -= W;}fread(InputData, sizeof(short), FileLength, Ifp);for (int i = 0; i < FileLength; i++) {fprintf(txt, "%d\n", InputData[i]);}char *buf;long filesize;filesize = ftell(Ifp);//ftell求文件指針相對于0的便宜字節數,就求出了文件字節數buf = (char *)malloc(sizeof(char)*filesize);//開辟空間給緩存數組fread(buf, 1, (filesize - 44), Ifp);//每次讀一個字節到buf,同時求讀的次數return 0; }

二. 結果

三. 小結

WAV格式語音數據文件頭數據中包含許多關鍵的語音文件信息如:

// 文檔標識。 大寫字符串"RIFF",標明該文件為有效的 RIFF 格式文檔。

// 文件數據長度。 從下一個字段首地址開始到文件末尾的總字節數。該字段的數值加 8 為當前文件的實際長度。

// 文件格式類型。 所有 WAV 格式的文件此處為字符串"WAVE",標明該文件是 WAV 格式文件。

// 格式塊標識。 小寫字符串,"fmt "。

// 格式塊長度。 其數值不確定,取決于編碼格式。可以是 16、 18 、20、40 等。

// 編碼格式代碼。 常見的 WAV 文件使用 PCM 脈沖編碼調制格式,該數值通常為 1。

// 聲道個數。 單聲道為 1,立體聲或雙聲道為 2。

// 采樣頻率。 每個聲道單位時間采樣次數。常用的采樣頻率有11025,16000 , 22050 和 44100 Hz。

// 數據傳輸速率。 該數值為:聲道數×采樣頻率×每樣本的數據位數/8。播放軟件利用此值可以估計緩沖區的大小。

// 數據塊對齊單位。 采樣幀大小。該數值為:聲道數×位數/8。播放軟件需要一次處理多個該值大小的字節數據,用該數值調整緩沖區。

// 采樣位數。 存儲每個采樣值所用的二進制數位數。常見的位數有 4、8、12、16、24、32。

通過讀取文件頭數據信息,就可以得知語音文件數據的大多數格式信息,下一篇將介紹分段讀取WAV語音文件中語音數據部分的實例。

總結

以上是生活随笔為你收集整理的VS语音信号处理(1) C语言读取WAV语音文件文件头数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。