WAVWM8978

news/2024/11/15 1:35:50/

一、WAV
WAV即WAVE文件,是最常用的数字化声音文件格式之一,扩展名为‘.wav’,用于保存Windows平台的音频信息资源。WAV格式还支持MS ADPCM、CCITT A LAW 等多种压缩运算法,支持多种音频数字,取样频率和声道。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率及16位量化数字,二者声音文件质量相差无几。
WAV是由若干个Chunk(区块)组成的。按照在文件中的出现位置包括
①RIFF WAVE Chunk、②Format Chunk、③Fact Chunk(可选)和④Data Chunk。每个Chunk由块标识符、数据大小和数据三部分组成,如下图所示:
在这里插入图片描述
其中块标识符由4个 ASCII码构成,数据大小则标出紧跟其后的数据的长度(单位为字节),注意这个长度不包含块标识符和数据大小的长度,即不包含最前面的8个字节。所以实际Chunk的大小为数据大小加8。
1)RIFF块(RIFF WAVE Chunk):该块以“RIFF”表示,紧跟wav文件大小,(该大小是wav文件大小-8),然后数据段为“WAVE”,表示是wav文件。RIFF块的Chunk结构如下:

//RIFF块
typedef __packed struct{
u32 ChunkID;//此处固定为’RIFF‘,即0x46464952,RIFF的ASCII码,查ASCII码表应该按十六进制序列查
u32 ChunkSize;//集合大小,文件总大小-8
u32 Format;//格式——WAVE,即0x45564157(此处为倒序,’57‘是W,41是A等
//上面的ChunkID以及之后的都是按这个规则得出十六进制值的
}

2)Format块(Format Chunk):该块以“fmt "作为标示(注意fmt后有一个空格),一般情况下,该段的大小为16个字节,但是有些软件生成的.wav格式,该部分可能有18个字节,含有2个字节的附加信息。Format块的Chunk结构如下:

//fmt块
typedef __packed struct{
u32 ChunkID;
//chunk id;这里固定为"fmt ",即OX20746D66
u32 ChunkSize ;
//子集合大小(不包括ID和Size);
u16 AudioFormat;
//音频格式;一般为OX0001,表示线性PCM;
u16 NumOfChannels;
//通道数量;1,表示单声道;2,表示双声道;
u32 SampleRate;
//采样率;0X1F40,表示8Khz
u32 ByteRate;
//字节速率=采样率*通道数*(ADC位数/8)
u16 BlockAlign;
//块对齐(字节)=通道数*(ADC位数/8)
u16 BitsPerSample;
//单个采样的位数;16位PCM,设置为16
u16 ByteExtraData;
//附加的数据字节;2个;线性PCM,没有这个参数
}ChunkFMT;

3)Fact块 (Fact Chunk):该块为可选块,以“fact"作为标示,不是每个WAV文件都有,在非PCM格式的文件中,一般会在Format结构后面加入一个Fact块,该块Chunk结构如下:

//fact块
typedef __packed struct{
u32 ChunklD;
//chunk id;这里固定为"fact",即OX74636166;
u32 ChunkSize ;
//子集合大小(不包括ID和Size);这里为:4.
u32 DataFactSize;
//数据转换为PCM格式后的大小
}ChunkFACT;

DataFactSize是这个Chunk中最重要的数据,如果这是某种压缩格式的声音文件,那么从这里就可以知道他解压缩后的大小。对于解压时的计算会有很大的好处。若使用的是PCM格式,则不存在这个块。
4)数据块(Data Chunk):该块是真正保存wav数据的地方,以“data”"作为该Chunk的标示,然后是数据的大小。数据块的Chunk结构如下:

//data块
typedef __packed struct{
u32 ChunkID;
//这里固定为”data“,即0x61746164
u32 ChunkSize;
//子集合大小,不包括ID和Size
}ChunkDATA;

ChunkSize的大小就是音频数据的大小(仅指音频数据大小,不包括Chunk ID之类的数据),在ChunkSize之后,紧跟音频数据。

WAV数据说明
根据Format Chunk中的声道数和采样bit数,wav数据的bit位置可以分成如下形式:
在这里插入图片描述
上述格式支持——16位和24位,立体声,每个取样为4或6个字节,低字节在前,高字节在后。在得到这些wav数据以后,通过I2S送给WM8978,即可播放。
二、WM8978
WM8978是一款全功能音频处理器,带有Hifi级数字信号处理内核,支持增强3D硬件环绕音效和5频段的硬件均衡器。同时集成了对麦克风的支持,和一个输出功率达0.9W的高质量功放。WM8978进一步提升了耳机放大器输出功率,在推动16欧姆耳机的时候,每声道最大输出功率达40毫瓦。可以连接绝大多数适合随身听的HI-FI耳机。
特点:
I2S接口,支持最高192K,24bit音频播放
DAC信噪比98dB; ADC信噪比90dB
支持无电容耳机驱动(提供40mW@16Q的输出能力)
支持扬声器输出(提供0.9W@8Q的驱动能力)
支持立体声差分输入/麦克风输入
支持左右声道音量独立调节支持3D效果,支持5路EQ调节

WM8978通过I2S接口(即数字音频接口)同MCU进行音频数据传输(支持音频接收和发送),通过两线(MODE=0,即IIC接口)或三线(MODE=1)接口进行配置。WM8978的12S接口,由4个引脚组成:
1,ADCDAT: ADC数据输出
2,DACDAT:DAC数据输入
3,LRC:数据左/右对齐时钟
4,BCLK:位时钟,用于同步
WM8978的I2S接口支持多种不同的音频数据模式:左(MSB)对齐标准、右(LSB)对齐标准、飞利浦(I2S)标准等。
飞利浦(I2S) 标准模式,数据在跟随LRC传输的BCLK的第二个上升沿时传输MSB,其他位一直到LSB按顺序传输。传输依赖于字长、BCLK频率和采样率,在每个采样的LSB和下一个采样的MSB之间都应该有未用的BCLK周期。
在这里插入图片描述
图中,fs即音频信号的采样率,比如44.1Khz,因此LRC的频率就是音频信号的采样率。另外,WM8978还需要一个MCLK,本例程由STM32F4为其提供MCLK时钟,MCLK的频率必须等于256fs,也就是音频采样率的256倍。
框图如下:
在这里插入图片描述
左半边为输入,右半边为输出。右下喇叭口可以驱动0.9W/8欧姆的喇叭,喇叭上方的接口可以接耳机,out3/4此例程中没用到。AUXR为对应的输入,LIN、LIP,RIN、RIP是左右MIC输入。L2、R2可作为LIN的输入,后接的开关可以选择增益(WM8978内部有很多模拟开关用来选择通道,同时还有很多调节器用来设置增益和音量)。中间的LADC、RADC为左声道ADC右声道ADC,LDAC、RDAC为左声道DAC和右声道DAC。上述相关都是通过相关寄存器来配置,介绍如下:
(1)R0寄存器(00h)
在这里插入图片描述
该寄存器用于控制WM8978的软复位,写任意值到该寄存器地址,即可实现软复位WM8978.
注:WM8978的寄存器是九位的只可写不可读寄存器。
(2)R1寄存器(01h):
在这里插入图片描述
BIASEN位设置为1,模拟部分的放大器才会工作放出声音。MICEN设置为1使能MIC,VMIDSEL设置为11选择5k欧姆,其他位用默认值0。
(3)R2寄存器(02h)
在这里插入图片描述
该寄存器设置ROUT1EN(bit8),LOUT1EN(bit7)和SLEEP(bit6)等三个位;ROUT1EN和LOUT1EN设置为1使能耳机输出,SLEEP位设置为0进行正常工作模式。使能BOOSTENR和BOOSTENL设置为1.其他位设置为0.
(4)R3寄存器(03h)
在这里插入图片描述
该寄存器设置LOUT2EN(bit6),ROUT2EN(bit5),RMIXER(bit3),LMIXER(bit2),DACENR(bit1)和DACENL(bit0)等6个位。LOUT2EN和ROUT2EN,设置为1,使能喇叭输出:LMIXER和RMIXER设置为1,使能左右声道混合器: DACENL和DACENR是使能左右声道的DAC,必须设置为1。
(5)R4寄存器(04h)
在这里插入图片描述

该寄存器要设置WL(bit6:5)和FMT(bit4:3)等4个位。WL(bit6:5)用于设置字长(即设置音频数据有效位数),00表示16位音频,10表示24位音频,具体表示见上表;FMT(bit4:3)用于设置I2S音频数据格式(模式),此处一般设置为10,表示I2S格式(飞利浦模式)。
(6)R6寄存器(06h)
在这里插入图片描述
该寄存器全设置为0即可,设置MCLK和BCLK都来自于Stm32的时钟提供。
(7)R10寄存器(0Ah)
在这里插入图片描述
该寄存器我们要设置SOFTMUTE(bit6)和DACOSR128(bit3)等两个位,SOFTMUTE设置为0,关闭软件静音; DACOSR128过采样率选择设置为1, DAC得到最好的SNR。
(8)R49寄存器(31h)
在这里插入图片描述
该寄存器要设置SPKBOOST(bit2)和TSDEN(bit1)这两个位。SPKBOOST用于设置喇叭的增益,设置为0即可(gain=-1),如想获得更大的声音,设置为1(gain=+1.5)即可;TSDEN用于设置过热保护,设置为1(开启)即可。
(9)R50&R51寄存器(32h和33h)
在这里插入图片描述
(上图为R50)用于设置左声道,另一个(R51)用于设置右声道。只需要设置这两个寄存器的最低位(DACL2L MIX)为1即可,将左右声道的DAC输出接入左右声道混合器里面,即可听到播放的内容。
(10)R52&R53寄存器(34h&35h)
在这里插入图片描述
上图为R52寄存器,用于设置耳机输出左声道(R52),另一个用于设置耳机输出右声道(R53)。这两个寄存器的最高位(HPVU)用于设置是否更新左右声道的音量,最低6位(LOUT1VOL)用于设置左右声道的音量,我们可以先设置好两个寄存器的音量值,最后设置其中一个寄存器最高位为1,即可更新音量设置。
(11)R54&R55寄存器(36h&37h)
在这里插入图片描述
这两个寄存器用于设置喇叭音量,配置同上类似,最低六位(LOUT2VOL)设置音量大小,有64个等级,最后设置SPKVU为1进行更新配置。


http://www.ppmy.cn/news/139777.html

相关文章

PL51RC003

PL51RC003 是高度集成的非接触式(13.56MHz)读写器SOC。此发送模块利用调制和解调的原理,并将它们完全集成到各种非接触式通信方法和协议中(13.56MHz)。发送模块支持读写器模式,支持 ISO14443A/MIFARE。 PL5…

ARM学习系列 ---- ARM公司简介

1 ARM的发展历程 1978年,CPU (Cambridge Processor Unit)公司在英国剑桥诞生,意为“剑桥处理器单元”。次年,该公司又改名为Acorn。在后续几年,陆续推出BBCMicro微型计算机和ARM1芯片。直到1990年,由苹果公司、芯片厂商…

ST推出 28nm MCU ,NXP更狠,推出16nm MCU

关注星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 近几年,随着新能源汽车的不断兴起,汽车级 MCU 也是在不断更新升级,各大通用 MCU 厂商也是纷纷布局汽车级MCU。 ST 汽车级 MCU 最近,S…

android8.1源码从下载至本地到导入as可调试到编译源码并刷机到导入clion可调试一条龙

目录 前言 一:下载源码 二:导入代码到as 接下来配置as,使之可调试 三:编译源码 编译 aosp_x86_64-eng 版本 为了进一步检验我们编译产出的镜像是否可用 编译 nexus 6p ( aosp_angler-userdebug )版本 直接刷机 另外也可…

STM32——WAVWM8978简介

1、什么是WAV? WAV即WAVE文件,是最常用的数字化声音文件格式之一,其扩展名为“.wav”。符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台…

RegexSharp - 正则表达式工具 - v0.1 r52

因为经常用到正则表达式,又苦于找不到用着顺手的正则表达式工具,最终还是选择自己做一个。 功能不多,不过已经足够正常使用了。计划以后会加入更多功能。当然,任何意见都可以直接提出来,欢迎试用。 开源与Google Code…

【NLP】文本分类综述 | 迈向NLP大师的第一步(下)

作者 | lucy 北航博士在读 文本挖掘/事件抽取方向 整理 | NewBeeNLP 大家好,这里是NewBeeNLP。本系列文章总结自然语言处理(NLP)中最基础最常用的「文本分类」 任务,主要包括以下几大部分: 综述(Surveys&…

嵌入式:ARM系列处理器详解与性能对比

文章目录 ARM7微处理器系列ARM9微处理器系列ARM9E微处理器系列ARM10E微处理器系列SecurCore微处理器系列StrongARM微处理器系列Xscale处理器Cortex处理器MMU vs MPUMMU vs MPU总结 ARM Cortex – M系列处理器CPU性能测试三大标准 ARM Cortex-R系列处理器Cortex-R7Cortex-R8Cort…