TI论坛
直播中

王超

7年用户 1315经验值
私信 关注
[问答]

TMS320C5517怎么调节音量大小,可不可以不减小幅值在程序里调?


  • 开发板用的是TMS320C5517
    这是一段1KHz的正弦波音频信号,播放的时候声音太大,怎么调节音量大小,可不可以不减小幅值在程序里调。Gi有个问题就是C5517有两片AIC3204,可不可以在两个模块同时播放同一段声音
    #include "stdio.h"
    #include "evm5517.h"

    extern Int16 AIC3204_rset( Uint16 regnum, Uint16 regval);

    #define Xmit 0x20

    /*
    *
    *  aic3204_tone_headphone( )
    *      Output a 1 kHz tone through the STEREO OUT jack
    *
    */
    Int16 aic3204_tone_headphone( )
    {
        /* Pre-generated sine wave data, 16-bit signed samples */
        Int16 sinetable[48] = {
            0x0000, 0x10b4, 0x2120, 0x30fb, 0x3fff, 0x4dea, 0x5a81, 0x658b,
            0x6ed8, 0x763f, 0x7ba1, 0x7ee5, 0x7ffd, 0x7ee5, 0x7ba1, 0x76ef,
            0x6ed8, 0x658b, 0x5a81, 0x4dea, 0x3fff, 0x30fb, 0x2120, 0x10b4,
            0x0000, 0xef4c, 0xdee0, 0xcf06, 0xc002, 0xb216, 0xa57f, 0x9a75,
            0x9128, 0x89c1, 0x845f, 0x811b, 0x8002, 0x811b, 0x845f, 0x89c1,
            0x9128, 0x9a76, 0xa57f, 0xb216, 0xc002, 0xcf06, 0xdee0, 0xef4c
        };
        Int16 j, i = 0;
        Int16 sample;
       
         /* Configure AIC3204 */
        AIC3204_rset(  0, 0x00 );      // Select page 0
        AIC3204_rset(  1, 0x01 );      // Reset codec
        AIC3204_rset(  0, 0x01 );      // Point to page 1
        AIC3204_rset(  1, 0x08 );      // Disable crude AVDD generation from DVDD
        AIC3204_rset(  2, 0x00 );      // Enable Analog Blocks
        /* PLL and Clocks config and Power Up */
        AIC3204_rset(  0, 0x00 );      // Select page 0
        AIC3204_rset( 27, 0x00 );      // BCLK and WCLK is set as i/p to AIC3204(Slave)
        AIC3204_rset(  4, 0x07 );      // PLL setting: PLLCLK <- BCLK and CODEC_CLKIN <-PLL CLK
        AIC3204_rset(  6, 0x08 );      // PLL setting: J
        AIC3204_rset(  7, 0 );         // PLL setting: HI_BYTE(D)
        AIC3204_rset(  8, 0 );         // PLL setting: LO_BYTE(D)  
        /* For 48 KHz sampling */
        AIC3204_rset(  5, 0x92 );      // PLL setting: Power up PLL, P=1 and R=2
        AIC3204_rset( 13, 0x00 );      // Hi_Byte(DOSR) for DOSR = 128 decimal or 0x0080 DAC oversamppling
        AIC3204_rset( 14, 0x80 );      // Lo_Byte(DOSR) for DOSR = 128 decimal or 0x0080
        AIC3204_rset( 20, 0x80 );      // AOSR for AOSR = 128 decimal or 0x0080 for decimation filters 1 to 6
        AIC3204_rset( 11, 0x88 );      // Power up NDAC and set NDAC value to 8
        AIC3204_rset( 12, 0x82 );      // Power up MDAC and set MDAC value to 2
        AIC3204_rset( 18, 0x88 );      // Power up NADC and set NADC value to 8
        AIC3204_rset( 19, 0x82 );      // Power up MADC and set MADC value to 2
        /* DAC ROUTING and Power Up */
        AIC3204_rset(  0, 0x01 );      // Select page 1
        AIC3204_rset( 12, 0x08 );      // LDAC AFIR routed to HPL
        AIC3204_rset( 13, 0x08 );      // RDAC AFIR routed to HPR
        AIC3204_rset(  0, 0x00 );      // Select page 0
        AIC3204_rset( 64, 0x02 );      // Left vol=right vol
        AIC3204_rset( 65, 0x00 );      // Left DAC gain to 0dB VOL; Right tracks Left
        AIC3204_rset( 63, 0xd4 );      // Power up left,right data paths and set channel
        AIC3204_rset(  0, 0x01 );      // Select page 1
        AIC3204_rset( 16, 0x06 );      // Unmute HPL , 6dB gain
        AIC3204_rset( 17, 0x06 );      // Unmute HPR , 6dB gain
        AIC3204_rset(  9, 0x30 );      // Power up HPL,HPR
        AIC3204_rset(  0, 0x00 );      // Select page 0
        EVM5517_wait( 500 );           // Wait
        /* ADC ROUTING and Power Up */
        AIC3204_rset(  0, 0x01 );      // Select page 1
        AIC3204_rset( 52, 0x0C );      // STEREO 1 Jack
                                       // IN2_L to LADC_P through 40 kohm
        AIC3204_rset( 55, 0x0C );      // IN2_R to RADC_P through 40 kohmm
        AIC3204_rset( 54, 0x03 );      // CM_1 (common mode) to LADC_M through 40 kohm
        AIC3204_rset( 57, 0xC0 );      // CM_1 (common mode) to RADC_M through 40 kohm
        AIC3204_rset( 59, 0x00 );      // MIC_PGA_L unmute
        AIC3204_rset( 60, 0x00 );      // MIC_PGA_R unmute
        AIC3204_rset(  0, 0x00 );      // Select page 0
        AIC3204_rset( 81, 0xc0 );      // Powerup Left and Right ADC
        AIC3204_rset( 82, 0x00 );      // Unmute Left and Right ADC
       
        AIC3204_rset( 0,  0x00 );   
        EVM5517_wait( 200 );           // Wait
       
        /* I2S settings */
        I2S0_SRGR = 0x0015;
        I2S0_ICMR = 0x0028;    // Enable interrupts
        I2S0_CR   = 0x8012;    // 16-bit word, Master, enable I2S

        /* Play Tone */
        for ( i = 0 ; i < 5 ; i++ )
        {
            for ( j = 0 ; j < 1000 ; j++ )
            {
                for ( sample = 0 ; sample < 48 ; sample++ )
                {
                    I2S0_W0_MSW_W = (sinetable[sample]/5) ;  // Send left sample
                    I2S0_W0_LSW_W = 0;
                    I2S0_W1_MSW_W = (sinetable[sample]/5) ;  // Send right sample
                    I2S0_W1_LSW_W = 0;
                    while((Xmit & I2S0_IR) == 0);          // Wait for interrupt
                }
            }
        }
        /* Disble I2S */
        I2S0_CR = 0x00;
       
        return 0;
    }

回帖(1)

王璐

2024-10-18 17:48:53
TMS320C5517是一款由德州仪器(Texas Instruments)生产的数字信号处理器(DSP),广泛应用于音频处理、通信、工业控制等领域。在您的开发板上,使用了两片AIC3204音频编解码器,可以实现立体声音频信号的播放。

关于您的问题,如何调节音量大小,以及是否可以在程序中调节音量而不减小幅值,以下是一些建议:

1. 调节音量大小:您可以通过修改AIC3204的音量控制寄存器来实现音量的调节。AIC3204的音量控制寄存器有多个,分别控制不同的音频通道。例如,您可以修改左声道和右声道的音量控制寄存器,以实现立体声音频信号的音量调节。

```c
Uint16 left_volume = 0x8000; // 音量值,范围为0x0000(静音)至0xFFFF(最大音量)
Uint16 right_volume = 0x8000;

AIC3204_rset(0x02, left_volume); // 设置左声道音量
AIC3204_rset(0x04, right_volume); // 设置右声道音量
```

2. 不减小幅值在程序里调:您可以通过修改音频信号的幅值来实现音量的调节,但这会导致音频信号的动态范围减小。为了避免这种情况,您可以使用数字信号处理技术,如动态范围压缩(Dynamic Range Compression)或增益控制(Gain Control),在不减小幅值的情况下实现音量的调节。

3. 同时播放同一段声音:由于您的开发板上有两片AIC3204,您可以在两个模块上同时播放同一段声音。为了实现这一点,您需要确保两个AIC3204的时钟和数据接口同步。以下是一段示例代码,展示了如何在两个AIC3204模块上同时播放1kHz正弦波音频信号:

```c
#include "stdio.h"
#include "evm5517.h"
extern Int16 AIC3204_rset( Uint16 regnum, Uint16 regval);

#define Xmit 0x20

Int16 aic3204_tone_headphone( ) {
    /* Pre ... */

    // 设置AIC3204模块1的音量
    Uint16 left_volume1 = 0x8000;
    Uint16 right_volume1 = 0x8000;
    AIC3204_rset(0x02, left_volume1);
    AIC3204_rset(0x04, right_volume1);

    // 设置AIC3204模块2的音量
    Uint16 left_volume2 = 0x8000;
    Uint16 right_volume2 = 0x8000;
    AIC3204_rset(0x02 + 0x100, left_volume2); // 假设模块2的寄存器地址偏移量为0x100
    AIC3204_rset(0x04 + 0x100, right_volume2);

    /* ... Post */
    return 0;
}
```

请注意,您需要根据您的开发板硬件设计和AIC3204模块的配置来调整上述代码。希望这些建议对您有所帮助!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分