色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于DWC2的USB驅動開發-UAC之WAV-PCM音頻文件格式詳解

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-07-27 09:02 ? 次閱讀

一. 前言

在做UAC,PWM音頻播放的項目,需要解析WAV格式文件,通過UAC發送,或接收PCM數據,驅動喇叭播放。這里對WAV文件格式相關內容進行整理備忘。

僅介紹使用非壓縮的PCM(Puls Code Modulation)脈沖編碼調制格式,其他壓縮格式這里不描述。

二.參考

http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf

http://soundfile.sapp.org/doc/WaveFormat/

http://www.lightlink.com/tjweber/StripWav/WAVE.html

三.格式解析

WAVE文件格式是微軟RIFF多媒體文件存儲規范的一個子集。RIFF文件從一個文件頭開始,后面跟著一系列數據塊。WAVE文件通常只是一個RIFF文件,其中包含一個由兩個子塊組成的“WAVE”塊——一個“fmt”塊指定數據格式,一個“data”塊包含實際的示例數據。我們稱這種形式為“規范形式”。

如下所示由RIFF fmt data三個chunk組成。

Offset Size Name Description

規范的WAVE格式以RIFF報頭開始:

0 4 ChunkID ASCII的"RIFF" 0x52494646 大端

4 4 ChunkSize 36+SubChunk2Size即 4+(8+SubChunk1Size)+(8+SubChunk2Size)

ChunkSize之后所有內容的大小即

整個文件-8即不包括ChunkID和ChunkSize的大小.

8 4 Format ASCII的"WAVE"(0x57415645 大端).

"WAVE" 包括以下兩個subchunks: "fmt " 和 "data":

"fmt " subchunk描述聲音數據的格式:

12 4 Subchunk1ID ASCII的 "fmt "(0x666d7420 大端).

16 4 Subchunk1Size 對于PCM為16.Subchunk1Size后本chunk剩余部分大小.

20 2 AudioFormat 格式:PCM = 1(即線性量化值),其他值為壓縮格式.

22 2 NumChannels 通道數:Mono = 1, Stereo = 2, etc.

24 4 SampleRate 采樣率:8000, 44100, etc.

28 4 ByteRate 字節速率: SampleRate * NumChannels * BitsPerSample/8

32 2 BlockAlign 塊大小,即一個采樣所有通道的數據量:NumChannels * BitsPerSample/8(是不是應該向上取整?)

34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc.

2 ExtraParamSize 其他參數大小:對于PCM沒有

X ExtraParams 其他參數

"data" subchunk 包括數據的大小和實際的數據:

36 4 Subchunk2ID ASCII的"data"(0x64617461 大端).

40 4 Subchunk2Size 后續數據大小:NumSamples * NumChannels * BitsPerSample/8.

44 * Data 實際的數據.

以上注意所有整數是小端格式,字符ID和字符format都是大端(按照字符順序,從低地址開始按順序依次存放)。WAVE數據文件的默認字節順序是小端序。使用大端字節排序方案編寫的文件具有標識符RIFX而不是RIFF。

樣本數據必須在偶數字節邊界上結束 。

8位采樣被存儲為無符號字節,范圍從0到255。16位采樣被存儲為2補碼有符號整數,范圍從-32768到32767。

在Wave數據流中可能有額外的子塊。

RIFF代表資源交換文件格式。

多媒體應用需要存儲和管理各種各樣的數據,包括位圖、音頻數據、視頻數據和外圍設備控制信息。RIFF提供了一種存儲所有這些不同類型數據的方法。RIFF文件包含的數據類型由文件擴展名表示。可能存儲在RIFF文件中的數據示例如下:

·Audio/visual interleaved data (.AVI)

·Waveform data (.WAV)

·Bitmapped data (.RDI)

·MIDI information (.RMI)

·Color palette (.PAL)

·Multimedia movie (.RMN)

·Animated cursor (.ANI)

·A bundle of other RIFF files (.BND)

四.舉例說明

一個WAVE文件的前面72字節如下

52 49 46 46** 24 08 00 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00** 02 00** 22 56 00 00 88 58 01 00 04 00 10 00 64 61 74 61 **00 08 00 00 00 00 00 00 24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d

另外一個文件格式解析如下

字節速率: SampleRate * NumChannels * BitsPerSample/8 = 44100216/2=176,400=0x0002B110

五.音頻處理工具

二進制編輯查看010Editor

Sox:https://sox.sourceforge.net/Main/HomePage

六.WAV文件曲線顯示

# -*- coding: utf-8 -*-
import wave
import pylab as pl
import numpy as np
# 打開WAV文檔
f = wave.open(r"1.wav", "rb")
# 讀取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
print(params)
# 讀取波形數據
str_data = f.readframes(nframes)
f.close()
#將波形數據轉換為數組
wave_data = np.fromstring(str_data, dtype=np.short)
wave_data.shape = -1, 2
wave_data = wave_data.T
time = np.arange(0, nframes) * (1.0 / framerate)
# 繪制波形
pl.subplot(211) 
pl.plot(time, wave_data[0])
pl.subplot(212) 
pl.plot(time, wave_data[1], c="g")
pl.xlabel("time (seconds)")
pl.show()

七.解析C代碼

#define CHUNK_RIFF "RIFF"
#define CHUNK_WAVE "WAVE"
#define CHUNK_FMT "fmt "
#define CHUNK_DATA "data"
?
#define AUDIO_FORMAT_PCM 0x01
?
typedef struct
{
    uint32_t off;
    uint32_t chunksize;
    uint16_t audioformat;
    uint16_t numchannels;
    uint32_t samplerate;
    uint32_t byterate;
    uint16_t blockalign;
    uint16_t bitspersample;
    uint32_t datasize;
}wav_t;
?
int wav_decode(uint8_t* addr, wav_t* wav);
?
int wav_decode(uint8_t* addr, wav_t* wav)
{
    uint8_t* p = addr;
    uint32_t chunksize;
    uint32_t subchunksize;
    if(0 != memcmp(p,CHUNK_RIFF,4))
    {
        return -1;
    }
    p += 4;
    chunksize = (uint32_t)p[0] | ((uint32_t)p[1]< 8) | ((uint32_t)p[2]< 16) | ((uint32_t)p[3]< 24);
    wav- >chunksize = chunksize;
    p += 4;
    if(0 != memcmp(p,CHUNK_WAVE,4))
    {
        return -2;
    }
    p += 4;
?
    do
    {
        if(0 == memcmp(p,CHUNK_FMT,4))
        {
            p += 4;
            subchunksize = (uint32_t)p[0] | ((uint32_t)p[1]< 8) | ((uint32_t)p[2]< 16) | ((uint32_t)p[3]< 24);
            p += 4;
            /* 解析參數 */
            wav- >audioformat = (uint16_t)p[0] | ((uint16_t)p[1]< 8);
            if(wav- >audioformat == 0x0001)
            {
                p += 2;
                wav- >numchannels = (uint16_t)p[0] | ((uint16_t)p[1]< 8);
                p += 2;
                wav- >samplerate = (uint32_t)p[0] | ((uint32_t)p[1]< 8) | ((uint32_t)p[2]< 16) | ((uint32_t)p[3]< 24);
                p += 4;
                wav- >byterate = (uint32_t)p[0] | ((uint32_t)p[1]< 8) | ((uint32_t)p[2]< 16) | ((uint32_t)p[3]< 24);
                p += 4;
                wav- >blockalign = (uint16_t)p[0] | ((uint16_t)p[1]< 8);
                p += 2;
                wav - >bitspersample = (uint16_t)p[0] | ((uint16_t)p[1]< 8);
                p += 2;
            }
            else
            {
                p += subchunksize;
            }
        }
        else if(0 == memcmp(p,CHUNK_DATA,4))
        {
            p += 4;
            subchunksize = (uint32_t)p[0] | ((uint32_t)p[1]< 8) | ((uint32_t)p[2]< 16) | ((uint32_t)p[3]< 24);
            wav- >datasize = subchunksize;
            p += 4;
            wav- >off = (uint32_t)(p- addr);
            return 0;
        }
        else
        {
            p += 4;
            subchunksize = (uint32_t)p[0] | ((uint32_t)p[1]< 8) | ((uint32_t)p[2]< 16) | ((uint32_t)p[3]< 24);
            p += 4;
            p += subchunksize;
        }
    }while((uint32_t)(p - addr) < (chunksize + 8));
    return -3;
}

八.測試文件下載

https://samplelib.com/zh/sample-wav.html

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    60

    文章

    7936

    瀏覽量

    264458
  • 音頻
    +關注

    關注

    29

    文章

    2868

    瀏覽量

    81491
  • 驅動開發
    +關注

    關注

    0

    文章

    130

    瀏覽量

    12072
  • DWC2
    +關注

    關注

    0

    文章

    35

    瀏覽量

    125
收藏 人收藏

    評論

    相關推薦

    基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2.0控制器簡介

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2
    的頭像 發表于 05-08 18:10 ?4584次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x01開篇介紹與新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器簡介

    基于DWC2USB驅動開發-0x02 DWC2 USB2.0 IP功能特征介紹

    DWC2即新思(Synopsys )的DesignWare? Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。從linux的內核源碼驅動中就帶
    的頭像 發表于 05-09 10:09 ?9357次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介紹

    基于DWC2USB驅動開發-IAD描述符詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-IAD描述符詳解 (qq.com) 一.? 前言 IAD描述符用于一個設備功能關聯多
    的頭像 發表于 06-27 08:45 ?12.4w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-IAD描述符<b class='flag-5'>詳解</b>

    基于DWC2USB驅動開發-USB復位詳解

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-USB復位詳解 (qq.com) 一.前言
    的頭像 發表于 07-07 11:18 ?6.4w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>復位<b class='flag-5'>詳解</b>

    基于DWC2USB驅動開發-USB連接詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-USB連接詳解 (qq.com) 一.前
    的頭像 發表于 07-07 08:46 ?3690次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>連接<b class='flag-5'>詳解</b>

    基于DWC2USB驅動開發-設備類驅動框架

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-設備類驅動框架 (qq.com) 一.前言 從軟件頂層,從數據流的角度來看
    的頭像 發表于 07-16 15:56 ?1306次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-設備類<b class='flag-5'>驅動</b>框架

    基于DWC2USB驅動開發-數據不能發送問題分析案例

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-數據不能發送問題分析案例 (qq.com) ? 一.前言 ? ? ? ?對于驅動
    的頭像 發表于 08-08 09:43 ?2269次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-數據不能發送問題分析案例

    請問如何把WAV,MP3格式音頻文件轉化為16位的數據IIS格式

    你好,請問如何把WAV,MP3格式音頻文件轉化為16位的數據IIS格式?
    發表于 10-23 07:24

    【NXP LPC54110試用體驗】WAV音頻文件

    是錄音時用的標準Windows文件格式,文件擴展名為”.wav”,數據本身的格式PCM或壓縮型,它是由微軟與IBM聯合
    發表于 10-27 18:07

    基于STM32的WAV音頻格式播放器

    語音的播放出現問題。由于WAV采用PCM編碼,音質也十分不錯,于是考慮用STM32對WAV格式音頻文件進行解碼,上周末開始找資料和編程,其中
    發表于 12-21 19:55

    WAV格式音頻文件剪切工具軟件下載

    WAV格式音頻文件剪切工具軟件下載:一個免費的音頻編輯工具.可以編輯音頻剪輯,聲音設計、控制、記錄等功能。重要的是免費呵。
    發表于 06-17 13:36 ?423次下載
    <b class='flag-5'>WAV</b><b class='flag-5'>格式</b><b class='flag-5'>音頻文件</b>剪切工具軟件下載

    數字音頻文件格式與接口標準

    數字化音頻格式的出現,是為了滿足復制、存儲、傳輸的需求 常用的數字音頻格式主要有:WAV文件、VOC文件和MP3
    發表于 04-09 17:53 ?134次下載
    數字<b class='flag-5'>音頻文件格式</b>與接口標準

    GIF文件格式詳解

    GIF文件格式詳解 GIF文件格式詳解 GIF文件格式詳解
    發表于 05-24 10:53 ?2次下載

    一招教你快速解析WAV文件格式

    語音的播放出現問題。由于WAV采用PCM編碼,音質也十分不錯,于是考慮用STM32對WAV格式音頻文件進行解碼,上周末開始找資料和編程,其中
    的頭像 發表于 08-01 09:38 ?2.4w次閱讀
    一招教你快速解析<b class='flag-5'>WAV</b><b class='flag-5'>文件格式</b>

    WAV文件格式詳解

    WAV是微軟公司開發的一種音頻格式文件,用于保存Windows平臺的音頻信息資源,它符合資源互換文件格式(Resource Intercha
    的頭像 發表于 10-21 09:52 ?5304次閱讀
    <b class='flag-5'>WAV</b><b class='flag-5'>文件格式</b><b class='flag-5'>詳解</b>
    主站蜘蛛池模板: 久久精品视频免费| 久久精品99热超碰| 国产色偷偷男人的天堂| 国厂精品114福利电影| 九九黄色大片| 美女打开双腿扒开屁股男生| 欧美久久综合网| 色一欲一性一乱一区二区三区 | 日本无吗高清| 午夜国产视频| 狂野猛交xxxx吃奶| 暖暖日本在线手机免费完整版 | 国产久久re6免费热在线| 后入式狂顶免费视频| 美女医生深夜在家裸睡惨死| 人成午夜免费视频| 亚洲AV久久无码精品蜜桃| 最美白虎逼| 跪趴式啪啪GIF动态图27报| 戳女人屁股流水羞羞漫画| 成人在线免费看片| 好紧好湿太硬了我太爽了小说| 久久亚洲国产精品亚洲| 日本漫画大全无翼乌| 亚洲国产夜色在线观看| 99久久久精品| 99久久久无码国产精品免费人妻 | 久久久久青草大香线综合精品| 男人舔女人的阴部黄色骚虎视频| 兽交白浆喷水高潮| 永久精品免费影院在线观看网站 | 99热久久视频只有精品6国产| 高H内射NP古文| 久久精品视频在线看99| 日本理伦片午夜理伦片| 亚洲深夜在线| 在线电台收听| 国产精品欧美一区二区在线看| 久久综合色视频| 午夜福利试看120秒体验区| 2019午夜福利757视频第12集|