576样本的PCM信号加窗之疑惑

PCM1863应用笔记 1. 配置需求 时钟输入:SCKI(24.576MHz) 模拟输入:VINL2(Stereo left channel),VINR2(Stereo right channel) LRCK:96KHz BCK:6.14MHz 2. 配置通信接口 In software SPI/I2C mode, a PCM186x software programmable device can use its 阅读详情

 

576样本的PCM信号加窗之疑惑

 

从WAV文件的语音数据中读出1152*2个语音数据, 对应到一个音框(frame). 这个1152*2个语音数据在一个frame中是有如图的分析

 

 

分组, 分声道处理的伪代码如下:

/* polyphase filtering 多相滤波, 对时域信号进行滤波*/

for(gr=0; gr<2; gr++)       // 组 group

{

    for(channel=config.wave.channels; channel--; )  // 声道 channel

    {

        /* 每次处理576个样本 18 == ( 576 / 32 ) */

        for(i=0; i<18; i++ )

        {

            /*

             * 对18循环是什么意思啊? 18 == (( 1152/2) / 32) )

             * 每次处理32个样本,对于buff[gr][channel]就需要处理18次, 因为是576个样本

             * 在最内层循环, 也就是这个18次循环里头. 传递给滤波器的是576笔数据

             */

             /*

             * 对PCM信号buffer_window[channel]加窗,

             * 得到加窗后的信号为win_que[channel][0]

             */

             window_subband(&buffer_window[channel], &win_que[channel][0], channel);

             /*

              * 对加窗信号win_que进行滤波, 得到子带信号sb_sample

              * sb_sample[2][3][18][SBLIMIT]

              */

              filter_subband(&win_que[channel][0], &sb_sample[channel][gr+1][i][0]);

        }

    }

}

 

short int buffer_window [channel][ samp_per_frame]

是用来存储PCM信号的, channel一般为2, 表示声道; samp_per_frame为576

 

需要细分析的就是

        for(i=0; i<18; i++ )

        {

            /*

             * 对18循环是什么意思啊? 18 == (( 1152/2) / 32) )

             * 每次处理32个样本,对于buff[gr][channel]就需要处理18次, 因为是576个样本

             * 在最内层循环, 也就是这个18次循环里头. 传递给滤波器的是576笔数据

             */

             /*

             * 对PCM信号buffer_window[channel]加窗,

             * 得到加窗后的信号为win_que[channel][0]

             */

             window_subband(&buffer_window[channel], &win_que[channel][0], channel);

             /*

              * 对加窗信号win_que进行滤波, 得到子带信号sb_sample

              * sb_sample[2][3][18][SBLIMIT]

              */

              filter_subband(&win_que[channel][0], &sb_sample[channel][gr+1][i][0]);

        }

如图2.10

对于最内层循环, 即真正的处理PCM信号的那一层. 每一次循环都会将&buffer_window[channel]取出32个样本. 在对x加窗的时候我一直不知道这32个样本如果存储到x中去, 一直认为是

直接平移到x中, FIFO的方式平移

buffer_window[channel][0]-- buffer_window[channel][31]平移到x[0]—x[31]

buffer_window[channel][32]-- buffer_window[channel][63]平移到x[32]—x[63]

 . . . .

如果是这样做的话, 那么PCM还有64个样本无法处理.

FK, 我错了!

 

加窗为什么要以这样的方式?

 

Shine的处理方式是

static int      off[ 2 ] = {0, 0};          // ???

/**

 * PURPOSE:  Overlapping window on PCM samples

 * SEMANTICS:

 * 32 16-bit pcm samples are scaled to fractional 2's complement and

 * concatenated to the end of the window buffer #x#. The updated window

 * buffer #x# is then windowed by the analysis window #enwindow# to produce the

 * windowed sample #z#

 *

 * 给PCM信号buffer加窗, 这个PCM信号具有576个样本. 输出加窗后的信号为z.

 * 这个加窗函数会被循环调用18次, 因为每个样本空间具有576个样本值, 而加窗函数每次只处理32个样本,

 * 所以必须连续处理18(576/32)次才能处理完成. 处理的顺序是 : 

 * 0-31, 511-480, 479-448, ... 63-32, 31-0, 511-480.(刚好18次)

 * 发现对于buffer—x是如此的操作

* x[31] = buffer[0] . . .  x[0] = buffer[31];

* x[511] = buffer[32] . . .  x[480] = buffer[63];

* . . .

* x[63] = buffer[480] . . .  x[32] = buffer[511];

* x[31] = buffer[512] . . .  x[0] = buffer[543];       // 覆盖了一次

* x[511] = buffer[544] . . .  x[480] = buffer[575]; // 覆盖了一次

*

* 这里是所无法理解的.

 *

 * **buffer     :   输入PCM信号 ---- 576个样本, 但是每执行一次该函数并不是对576个样本全加窗

 * z[HAN_SIZE]      :   加窗后的信号 ----

 * k                :   channels, 对左声道或右声道加窗.

 */

void

window_subband(short int **buffer, double z[HAN_SIZE], int k)

{

    /* replace 32 oldest samples with 32 new samples*/

    int i;

    for (i=0; i<32; i++)

    {

    /*

     * #define SCALE 32768 -- 0x8000  将信号幅度值左移了8位.

     *

     * x[k][index] 在第2维是否永远只有前32个元素是有效的?

     * 我觉得奇怪, 后面的(HAN_SIZE-32)个元素都是空的.

     * 以上观点是错误的, 因为之前我没有注意到off[]的存在以及它的含义, 呵呵!

     */

        x[ k ][ 31-i+off[k] ] = (double)( *( (*buffer)++ ) ) / SCALE;

    }

    /*

     * shift samples into proper window positions

     * 加窗

     * HAN_SIZE == 512

     *

     * 这里的窗是怎么加的啊, 好奇怪啊

     *

     * 明白了, x信号采取右移的方式, 移32个单位

     * 一共会加18次窗

     *

     *         | enwindow    0       1      2      3   ... 511

     * -------|-----------------------------------------------------------

     *       0 | x[][i]      0       1      2      3   ... 511

     *       1 | x[][i]      480     481     482 483 ...479

     *         |                     .

     *         |                 .

     *         |                     .

     *       17| x[][i]     511       510     509     508 ... 0  

     *

     */

    for (i=HAN_SIZE; i--; )

    {

        z[ i ] = x[ k ][ (i+off[k]) & (HAN_SIZE-1) ] * enwindow[ i ];

    }

   

    off[k] += 480;           /* offset is modulo (HAN_SIZE) */

    off[k] &= (HAN_SIZE - 1);

}

 

 

 

 

 

// ----------- 加窗以及滤波实现如下 -------------

/**

 *

 * Frame -- 台湾资料上把这个称为音框, 不知道我们怎么称

 *

 * 假令是2声道16位

 * Q: CBR/VBR?  A: CBR

 *

 * 对于MP3来说, 一个音框有2组数据, 每组数据有1152笔取样. 那么每个声道就有(1152/2)=576笔样值.

 *

 *

 */

#include <math.h>

#include <stdlib.h>

 

#include "types.h"

#include "tables.h"

#include "l3subband.h"

 

// -------------------------------------------------------------------------------

static int      off[ 2 ] = {0, 0};          // ???

/*

 * 存储PCM信号, x[0]是左声道, x[1]是右声道. 读一次WAVE流会读1152个样本点.

 * 那么左右声道各512个采样点.

 */

static double   x[ 2 ][ HAN_SIZE ];

/*

 * 子带滤波器阵列的系数, 由32个子带滤波器组成一个滤波器阵列.

 * filter[0][64]    第1个滤波器系数

 * filter[1][64]    第2个滤波器系数

 * filter[2][64]    第3个滤波器系数

 *      .               .

 *      .               .

 *      .               .

 * filter[31][64]   第31个滤波器系数

 * 对于一个子带滤波器而言, 有64个系数, 为什么是64个系数呢?这里我觉得奇怪

 * 按照规范是512个, 但是每隔64个就出现一次循环, 所以只需要64个就够了.

 * 假设前64个称为A

 * 则第2个64个为-A

 * 则第3个64个为A

 * 则第4个64个为-A

 *

 */

static double   filter[ SBLIMIT ][ 64 ];    // 32个频带, 每个频带64个系数

 

// -----------------------------------------------------------------------------

/* create_ana_filter */

/**

 * PURPOSE:  Calculates the analysis filter bank coefficients

 * SEMANTICS:

 * Calculates the analysis filterbank coefficients and rounds to the

 * 9th decimal place accuracy of the filterbank tables in the ISO

 * document.  The coefficients are stored in #filter#

 *

 * 计算 各个子带滤波器的系数.

 */

void

subband_initialise( void )

{

    int i, j, k;

   

    /*

     * 初始化输入信号. 两个声道x[0]--左声道, x[1]--右声道

     * PCM信号会存储到x中

     */

    for(i=2; i--; )

        for(j=HAN_SIZE; j--; )

            x[i][j] = 0;

   

    /*

     * 余弦调变, 用来载到低通滤波器上形成带通滤波器. PCM信号通过的就是

     * 调变后的带通滤波器.

     * 32个频带, 需要32个子频带滤波器组成一组滤波器 [0, 31]

     */

    for (i=32; i--; )

    {

        /*

         * 按道理k是需要循环512次, 注意到余弦调变的式子 cos( PI*(2*i+1)*(k-16)/64 )

         * 是一个周期性表达式, 64为半周期, 因此只需要计算64次就够了.

         */

         for (k=64; k--; )

         {

             /*

              * filter[i][k]*(1E9) 是为了希望精确度更高.实际上我认为 filter[i][k]*(1E8)

              * 也是可以的, 不知道这里乘上1E9是规范定的还是作者根据自己经验定的.

              */

             if ( ( filter[i][k]=1e9*cos((double)((2*i+1)*(16-k)*PI64)) ) >= 0 )

             {

                 modf( filter[i][k]+0.5, &filter[i][k] );

             }

             else

             {

                 modf( filter[i][k]-0.5, &filter[i][k] );

             }

             filter[i][k] *= 1e-9;   /* 还原(保证了高精确度) */

        }

    }

}

 

long int logx = 0;

/**

 * PURPOSE:  Overlapping window on PCM samples

 * SEMANTICS:

 * 32 16-bit pcm samples are scaled to fractional 2's complement and

 * concatenated to the end of the window buffer #x#. The updated window

 * buffer #x# is then windowed by the analysis window #enwindow# to produce the

 * windowed sample #z#

 *

 * 给PCM信号buffer加窗, 这个PCM信号具有576个样本. 输出加窗后的信号为z.

 * 这个加窗函数会被循环调用18次, 因为每个样本空间具有576个样本值, 而加窗函数每次只处理32个样本,

 * 所以必须连续处理18(576/32)次才能处理完成. 处理的顺序是 : 

 * 0-31, 511-480, 479-448, ... 63-32, 31-0, 511-480.

 * 发现第512-575这64个样本被抛弃了, 对此我感到很疑惑, 不知道为什么会被抛弃掉.

 *

 *

 * **buffer     :   输入PCM信号 ---- 576个样本, 但是每执行一次该函数并不是对576个样本全加窗

 * z[HAN_SIZE]  :   加窗后的信号 ----

 * k            :   channels, 对左声道或右声道加窗.

 */

void

window_subband(short int **buffer, double z[HAN_SIZE], int k)

{

    /*

     * replace 32 oldest samples with 32 new samples

     */

    int i;

    for (i=0; i<32; i++)

    {

    /*

     * #define SCALE 32768 -- 0x8000

     * 将信号幅度值左移了8位.

     *

     * x[k][index] 在第2维是否永远只有前32个元素是有效的?

     * 我觉得奇怪, 后面的(HAN_SIZE-32)个元素都是空的.

     * 以上观点是错误的, 因为之前我没有注意到off[]的存在以及它的含义, 呵呵!

     *

     * window_subband会被调用18次, 32*18=576. 576个样本要存储到512个里头,

     * shine采取的策略是舍去后64个样本. 如果舍去前32后32是不是也会一样有效果呢?

     * 也许应该试一试.

     * 处理的顺序是 : 

     * 0-31, 511-480, 479-448, ... 63-32, 31-0, 511-480.

     *

     */

        x[ k ][ 31-i+off[k] ] = (double)( *( (*buffer)++ ) ) / SCALE;

        /*

         掐头去尾舍去前32后32, 而不是舍去后64.

         */

    }

    /*

     * shift samples into proper window positions

     * 加窗

     * HAN_SIZE == 512

     *

     * 这里的窗是怎么加的啊, 好奇怪啊

     *

     * 明白了, x信号采取右移的方式, 移32个单位

     * 一共会加18次窗

     *

     *         | enwindow    0       1      2      3   ... 511

     * -------|-----------------------------------------------------------

     *       0 | x[][i]      0       1      2      3   ... 511

     *       1 | x[][i]      480     481     482 483 ... 479

     *         |                     .

     *         |                 .

     *         |                     .

     *       17| x[][i]       511     510     509     508 ... 0  

     *

     */

    for (i=HAN_SIZE; i--; )

    {

        z[ i ] = x[ k ][ (i+off[k]) & (HAN_SIZE-1) ] * enwindow[ i ];

    }

   

    off[k] += 480;           /* offset is modulo (HAN_SIZE) */

    off[k] &= (HAN_SIZE - 1);

}

 

/**

 * PURPOSE:  Calculates the analysis filter bank coefficients

 * SEMANTICS:

 *      The windowed samples #z# is filtered by the digital filter matrix #filter#

 * to produce the subband samples #s#. This done by first selectively

 * picking out values from the windowed samples, and then multiplying

 * them by the filter matrix, producing 32 subband samples.

 *

 * 加窗信号#z#通过数字滤波器阵#filter#产生子带信号#s#.

 * 首先会从窗信号中选择

 * 然后用矩阵#filter#去乘它们, 产生32个子带信号.

 *

 * z[HAN_SIZE]  :   加窗后的PCM信号, 该信号具有 512 个采样点.

 * s[SBLIMIT]   :   子带信号

 *

 */

void

filter_subband(double z[HAN_SIZE], double s[SBLIMIT])

{

    double y[ 64 ];

   int     i,  j;

  

    /*

     * z信号是经过加窗后的信号.

     * y[63] = z[511]+z[447]+z[383]+z[319]+z[255]+z[191]+z[127]+z[63]

     * y[62] = z[510]+z[446]+z[382]+z[318]+z[254]+z[190]+z[126]+z[62]

     *       .

     *       .

     *       .

     * y[0]  = z[448]+z[384]+z[320]+z[256]+z[192]+z[128]+z[64]+z[0]

     *

     * 这里是在提取公因式了,

     * 因为这8个会乘共同的因式cos(......)==filter[i][j]

     */

   for (i=64; i--; )

   {      

        for (j=8, y[i]=0; j--; )

        {

            y[i] += z[ i + (j<<6) ];

        }

    }

   /*

    * 通过余弦调变方式分为32路子带信号.

    * SBLIMIT==32

    */

   for (i=SBLIMIT; i--; )

   {

         for (j=64, s[i]= 0; j--; )

         {

           s[i] += filter[i][j] * y[j];

        }

    }

    /*

     伪代码为:

     int i, j;

     double s[ 32 ];

     for (i=SBLIMIT; i--; )

     {

        for(j=512, s[i]=0.0; j--; )

        {

            s[i] += filter[i][j] * z[j];   

        }

     }

     其中filter[i][j] 的数学表达式为 :

     cos( (2*i+1)*(j-16)*PI64 )

     */

}

 

 苦无同道, 有达人赐教不甚感激!

像素,帧,色度信号,亮度信号等概念的理解 像素,彩色图像,YUV,RGB,采样 阅读详情

相关推荐

数字音频接口全解析:I2S、PCM、PDM与TDM的应用场景与选择指南

本文全面解析了数字音频接口I2S、PCM、PDM与TDM的应用场景与选择指南。从模拟到数字的跨越出发,详细介绍了各接口的技术特点、硬件连接及性能调优方法,并提供了场景化选择策略和混合接口系统设计实践,帮助工程师在智能音箱、蓝牙耳机等项目中做出最优选择。

weixin_29243279的博客 220

MP3文件格式与编码原理解码流程详解

1 文件格式 MP3文件格式四部分,按顺序排列如下: ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量 Frame 音频帧序列 APEV2 包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量 ID3V1 包含了作者,作曲,专辑等信息,长度为128BYTE 1.1 ID3 V1 ID3 V1内容按顺序排列如下: 名称 位置(byte) 标签标志'TAG' 0~2 标题 3~32 艺术家 33~62 专辑

水龙吟的备忘录 1万+

TAS576xM数字音频放大器实战:1SPW调制、PLL时钟与I2C配置详解

数字音频放大器是现代音频系统的核心,它通过高效的功率转换技术,将数字音频信号转换为驱动扬声器的高功率模拟信号。其核心原理在于调制技术,如PWM,通过高速开关控制功率输出,在提升效率的同时追求高保真音质。这项技术的核心价值在于解决了便携设备续航与音质、紧凑设备散热与功率之间的矛盾。在消费电子和汽车音频等应用场景中,工程师需要深入理解并优化放大器的各个子系统。本文以德州仪器TAS576xM系列为例,深入探讨其关键的1SPW调制技术如何实现效率与音质的平衡,并解析其灵活的PLL时钟系统如何适配多样化的前端时钟源。

weixin_30660027的博客 421

音频相关pcm,增益

ADTS(Audio Data Transport Stream)头之于AAC https://blog.csdn.net/coloriy/article/details/90511746

sun007700的专栏 2018

PCM9211数字音频接收器:环路滤波器设计与时钟恢复原理详解

锁相环(PLL)是数字信号处理中的关键技术,其核心作用是从输入信号中恢复出稳定、同步的时钟。其工作原理是通过相位检测器、环路滤波器、压控振荡器和分频器构成的闭环系统,将输入信号的相位与内部振荡器锁定。这项技术的价值在于为数字音频、通信和测量系统提供了精准的时序基准,是保证数据完整性和系统性能的基石。在数字音频接口(DIR)应用中,PLL需要从S/PDIF等嵌入式时钟的数据流中提取低抖动的音频时钟,其性能直接决定了音质。环路滤波器作为PLL的关键外部电路,其设计(如电阻电容的参数选择)深刻影响着系统的锁定速度

weixin_29174013的博客 294

PCM186xEVM评估板实战:从硬件配置到软件调试的完整音频ADC开发指南

在嵌入式系统和专业音频设备开发中,高性能模数转换器(ADC)是实现高质量音频采集的核心。其原理是将连续的模拟音频信号,通过采样、量化和编码,转换为离散的数字信号,其技术价值在于决定了系统的动态范围、信噪比和保真度。无论是智能语音设备、专业录音接口还是便携式录音笔,都需要可靠的ADC方案来确保声音的清晰与真实。本文聚焦于德州仪器(TI)的PCM186x系列ADC及其官方评估板(EVM),深入解析其三种核心工作模式(包括主时钟、从时钟及USB音频流模式)的硬件跳线配置与时钟管理策略,并结合PurePath Co

weixin_28724661的博客 206

mp2 encoder--window_subband函数的FPGA实现笔记

MP2编码的协议文件 “IOS1172-3” TITLE PAGE PROVIDED BY ISOCD 11172-3CODING OF MOVING PICTURES AND ASSOCIATED AUDIOFOR DIGITAL STORAGE MEDIA AT UP TO ABOUT 1.5 MBIT/sPart 3 AUDIOCONTENTS 编码流程框图 算法模型 FI...

weixin_30491641的博客 251

PCM5242音频DAC电源管理与寄存器配置实战指南

在嵌入式音频系统设计中,数模转换器(DAC)是实现高保真音质输出的核心器件。其工作原理是将数字音频信号精确转换为模拟信号,其性能直接决定了最终的声音质量与系统功耗。为了在便携设备和复杂系统中实现高性能与低功耗的平衡,深度掌握DAC的电源管理、时钟配置及寄存器编程等底层技术至关重要。这些技术能有效优化系统能效,提升音频处理灵活性,并解决工程实践中的噪声、时序等常见问题。本文聚焦于德州仪器(TI)的PCM5242这款高度集成的音频DAC,深入解析其待机模式与掉电模式等电源管理机制,并提供详细的寄存器配置逻辑与实

weixin_30411819的博客 349

PCM和I2S区别

今天突然想到I2S和PCM接口都是数字音频接口,而我所见的蓝牙到cpu以及codec的音频接口都是用PCM接口,是不是两个接口有各自不同的应用呢?先来看下概念。     PCM(PCM-clock、PCM-sync、PCM-in、PCM-out)脉冲编码调制,模拟语音信号经过采样量化以及一定数据排列就是PCM了。理论上可以传输单声道,双声道立体声和多声道。是数字音频的raw data。

newtonnl的专栏 5万+

高通SA8295P音频接口深度解析:全面掌握SA8295P的LS-I2S、PCM/TDM与高性能音频处理技术设计

SA8295P提供丰富的音频接口选项,包括LS-I2S、PCM/TDM和HS-I2S接口,具备灵活的配置选项,适合各种高保真音频和高速数据传输应用。结合LS-I2S和PCM/TDM接口:在复杂的音频编解码器设计中,可结合使用LS-I2S和PCM/TDM接口,以处理和传输不同的音频数据流。使用HS-I2S接口:在软件定义无线电(SDR)系统中,高速I2S接口可处理高速数据流,如无线电信号的解码和处理。LS-I2S(低速I2S)接口是SA8295P的一部分,提供了丰富的音频数据传输选项。

weixin_43199439的博客 1410

STM32F103C8T6用官方bootloader实现IAP升级操作方法

在使用STM32F103C8T6单片机IAP功能时,可以自己写bootloader程序,也可以使用官方bootloader文件。下面说一下使用官方bootloader的使用方法。 首先下载官方bootloader文件 目前使用的是这个版本,打开文件夹,选择适合自己编译器的工程。 目前使用的是keil,所以打开MDK-ARM文件夹 打开IAP工程 打开后根据自己的单片机型号,对工程进行简单的修...

HXYDJ的博客 1万+

加窗分帧中各种窗函数

 在信号处理中,窗函数是一种除在给定区间之外取值均为0的实函数。譬如:在给定区间内为常数而在区间外为0的窗函数被形象地称为矩形窗。任何函数与窗函数之积仍为窗函数,所以相乘的结果就像透过窗口“看”其他函数一样。窗函数在光谱分析、滤波器设计以及音频数据压缩(如在Ogg Vorbis音频格式中)等方面有广泛的应用。 http://zh.wikipedia.org/wiki/%E7%AA%97

yongchunaq的专栏 1万+

STM32G0定时器中断实战:HAL库配置TIM2实现精准1秒LED闪烁(附完整代码)

本文深入解析了STM32G0系列微控制器中定时器中断的配置与应用,重点介绍了如何使用HAL库配置TIM2实现精准的1秒LED闪烁。通过详细讲解时钟树分析、预分频系数与自动重装载寄存器的计算原理,并结合CubeMX图形化配置与完整代码示例,帮助开发者从底层理解定时器工作机制,掌握可复用的工程化配置方法。

weixin_29194817的博客 253

AI智能棋盘录制PCM1863高保真声音

本文探讨PCM1863在AI智能棋盘中实现高保真声音采集的应用,涵盖硬件设计、信号处理与系统集成,展现声音感知如何提升人机交互体验。

weixin_42612804的博客 366

【ue4】【新手入门】|静态网格模型碰撞设置和合并Actor(合并静态网格体)

上一期学到把构建好的房子模型变成一个静态网格体(也是一个模型)但是静态网格体是没有碰撞的 所以要给这个模型设置碰撞。

m0_63501513的博客 4420

在Windows 11上用VirtualBox搞定WRF-Hydro 5.2.0:一个水文模型小白的Ubuntu 22.04虚拟机避坑实录

本文详细记录了在Windows 11上使用VirtualBox和Ubuntu 22.04虚拟机成功编译安装WRF-Hydro 5.2.0水文模型的全过程。从虚拟环境配置、依赖库安装到环境变量设置,作者分享了针对Linux新手的实用避坑技巧和关键命令,帮助科研人员高效完成水文模型的环境搭建。

weixin_30733003的博客 354

蓝牙A2DP音频数据传输通道实战解析:UART、PCM与I2S选型指南

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959834的博客 639

宜搭,高级认证实操2,FaaS连接器指导教程

找到FaasEntry.java将如下代码整体替换,注意引包。如图所示在util下新建EDSUtil.java代码如下。回到连接器界面点击右上角测试-->测试。连接器工厂-->新建FaaS连接器。保存-->前往云IDE开发。返回如图所示代码,部署成功。

2301_80286061的博客 3343

MP3解码原理

原文地址:http://www.eefocus.com/jjbearustc/blog/07-09/3525_b7189.html#articletop PCM信号进行MP3压缩时,以1152个PCM采样值为单位,封装成具有固定长度的MP3数据帧,帧是MP3文件的最小组成单位。在解码时,利用数据帧里的信息就可以恢复出1152个PCM采样值。这1152个采样值被分为2个粒度组,每个粒度组包含576

sunnylgz 3889

基于STFT和卷积神经网络的时序数据分类

我们提供了相应的代码和数据,读者可以直接运行并尝试在自己的数据集上进行分类实验。在本文中,我们将介绍一种基于短时傅里叶变换(STFT)和卷积神经网络(CNN)的时序数据分类方法。我们将提供可直接运行的代码和数据,以帮助读者理解和实现这一方法。STFT可以提取信号的频谱信息,有助于捕捉时序数据中的关键特征。在这个例子中,我们将使用一个简化的手势识别数据集作为示例。在这段代码中,我们使用Adam优化器和稀疏分类交叉熵损失函数进行模型的编译。然后,我们使用训练集进行模型的训练,同时使用测试集进行模型性能的验证。

CodeWOW的博客 694

ardupilot 日志分析《xKF1信息》

ardupilot 日志分析系列将会把ardupilot所有的日志文档进行分析,为我们分析无人机的运行状态,炸鸡原因,传感器状态,电机状态,控制信息,滤波信息做准备。本节主要分析xKF1日志信息,欢迎批评指正。学习好ardupilot必须会分析飞行日志,从飞行日志中我们可以学到很多无人机的知识。无人机是综合知识的体现,涵盖:导航、控制、滤波、算法、协议等各种知识,只有更全面的学习,才能在无人机的道路上越走越远。

陌城烟雨 1226

德州仪器PCM5242音频DAC芯片:高集成度与可编程DSP设计详解

数模转换器是数字音频系统中的核心器件,负责将数字音频信号精确还原为模拟波形。其性能直接决定了音频系统的动态范围、信噪比与总谐波失真等关键指标。在众多架构中,电流段DAC因其对时钟抖动不敏感和优异的线性度,成为高性能音频应用的主流选择。这种技术价值在于能够有效降低带外噪声和互调失真,从而在紧凑的消费电子设备中实现高保真音质。随着音频处理需求的复杂化,集成可编程DSP功能的DAC应运而生,它允许开发者植入自定义滤波器、动态范围控制等算法,极大地拓展了产品的声音调校与功能定制空间。本文聚焦的德州仪器PCM5242

fanjava 522

VCAST创建单元测试工程

选择工作目录,后面创建胡UT工程将会生成到这个目录。

qq_42851449的博客 2485

PCM186x音频ADC时钟架构深度解析:从PLL配置到多通道实战

在嵌入式音频系统设计中,时钟管理是决定音质与系统稳定性的核心技术。锁相环(PLL)作为关键的时钟合成模块,能够将非标准的系统时钟转换为精确的音频采样时钟,其核心价值在于解决了时钟源不匹配的工程难题。通过灵活的倍频与分频,PLL技术为高保真音频采集提供了稳定的时钟基础,广泛应用于消费电子、专业音频设备及车载娱乐系统。本文聚焦德州仪器PCM186x系列高性能音频ADC,深入剖析其集成的**高性能片上锁相环(PLL)**与**分层时钟管理架构**,详解如何利用PLL接受1-50MHz宽范围输入并生成精准音频时钟,

ciya3282的博客 392

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

PCM5242音频DAC的PLL时钟配置与寄存器编程实战指南

锁相环(PLL)是现代数字音频系统中的核心技术,它通过闭环反馈控制,将输入参考时钟倍频或分频,生成与目标采样率严格同步的高质量、低抖动系统主时钟。这项技术的核心价值在于解决了系统主时钟频率与音频采样率非整数倍匹配的难题,确保了数字模拟转换器(DAC)的精准工作,从而直接决定了最终音质。在音频接口、高保真播放器等应用场景中,PLL的灵活配置是实现高性能音频回放的关键。以德州仪器(TI)的PCM5242音频DAC为例,其内置的可编程分数PLL功能强大,但配置复杂,涉及R、J、D、P等多个系数的计算与约束条件满足

weixin_29189003的博客 225

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PCM5252音频DAC寄存器配置实战:时钟、DSP与GPIO详解

音频数模转换器(DAC)是嵌入式音频系统的核心,其性能发挥依赖于对内部寄存器的精准配置。理解DAC的时钟系统、数字信号处理通路和GPIO复用机制,是确保音频质量与系统稳定性的关键。时钟配置决定了数据转换的基准与精度,涉及PLL锁相环、分频器及主从模式设置,是音频系统设计的首要步骤。数字处理通路则负责音频数据的接收、格式对齐、DSP效果处理及音量控制,直接影响音质表现。灵活的GPIO系统可将内部状态(如PLL锁定、时钟错误)输出,极大便利了系统监控与调试。本文以TI的PCM5252芯片为例,深入剖析其**时钟

weixin_33730836的博客 363

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 对于M抽头的一般FIR Filter的伪代码实现
下一篇: 国外著名语音研究机构链接
xiaomantoubaba
博客等级 码龄23年 75粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值