lin2db & db2lin

lin2db & db2lin lin2db 计算方式 $$ y = 20 \times \log_{10}x $$查表代码 static float log2lut_base_float[8] = { 0, 0.169925001442312f, 0.321928094887362f, 0.459431618637297f, 0.584962500721156f, 0.700439718141092f, 0.807354922057604f, 0.906890595608519f }; static float log2lut_frac_float[8] = { 0.169925001442312f, 0.152003093445050f, 0.137503523749935f, 0.125530882083859f, 0.115477217419936f, 0.106915203916512f, 0.0995356735509144f, 0.0931094043914815f }; inline float lin2dbLut(float x) { //10*log10(x) 3.0103*log2(x) float M, result; int xi = *(int*)&x;//interpret float as raw int number int E = (xi >> 23) - 127;//float point, the 30~23bit is exponent xi &= 0x007FFFFF;//extract the mantissa bit 22~0bit xi |= ((int)127 << 23);//set the exponent bit to 127, which actuall is 0 M = *(float*)&xi - 1;//interpret the mantissa as float M = M * 8; result = (E + log2lut_base_float[(int)M] + (M - (int)M) * log2lut_frac_float[(int)M]) * 6.020599913279624; return result; // return (log2lut(x)*6.020599913279624); } 快速计算 ...

August 18, 2026 · 4 min · 794 words · hy

wav音频格式解析

wav音频格式解析 本文参考: WAVE文件格式解析 - Tocy - 博客园 (cnblogs.com) Wave File Specifications (mcgill.ca) 简介 WAV文件是一种常见的音频文件格式,其结构遵循RIFF(Resource Interchange File Format)规范,这种规范来源于微软和IBM,我们可以在参考博客中找到相关规范文档。 WAV文件是由chunk组成的,这些chunk通常由ckID、cksize、chunk data组成。 文件结构 首先是很经典的结构图: 这张图中有很多值得注意的地方: 在最左边表明了当前的字段的编码属于小端模式还是大端模式。 图中以不同的颜色区分了不同的chunk,而其中的subchunk表明了这些chunk之间的关系。 每个chunk都有其承载的信息内容,这些信息的组织也有相关规范。 接下来分别分析其中的chunk 本文中分析hex文件的截图来源于HexEd.it — 基于浏览器的十六进制编辑器 RIFF RIFF字段是每个WAV文件都有的部分 field Length Contents ckid 4 “RIFF” cksize 4 4+n WAVEID 4 “WAVE” WAVE chunks n 包括格式信息和数据块 这张表列出了RIFFchunk的结构,从中可知: 其他的信息都在WAVE chunk中,即开始的图中的subchunk部分。 同时,我们也知道这里的4+n指的是WAVEID的4字节和WAVE chunks的n字节,不包括ckid和cksize。 RIFF和WAVE属于固定的内容,是不会变的。 上图是对一个wav的文件放入16进制编辑器分析的截图,我们可以很容易看到转化为ASCII的RIFF和WAV字段。 fmt chunk fmt块是一个可选的块,但是其中包含很多重要的信息,包括channels、sample pre seconds、bits per sample等,所以一般的文件都会有这个块,没有这部分信息很多的播放器会无法解析播放。 Field Length Contents ckID 4 “fmt " cksize 4 16/18/40 wFormatTag 2 Format code 对应不同的音频编码 nChannels 4 声道数 nSamplePreSecond 4 采样率 nAvgBytesPerSec 4 音频码率 nBlockAlign 2 音频数据块大小 wBitsPerSample 2 量化位数,比如8bit、16bit cbSize 2 extension扩展块的大小(0 or 22) wValidBitsPerSample 2 有效位数 dwChannelMask 4 声道掩码,比如左声道、右声道 SubFormat 16 GUID,数据格式码 该表格中表示了许多重要信息,我们要注意以下几点: ...

August 18, 2026 · 2 min · 255 words · hy