12
2014
11

单声道音频播放出立体声效果

有人可能会说,单声道音频怎么可能能播放出立体声效果呢?

单声道是没有声相和方位感的,左右两个音箱发出的声音完全一摸一样,所以听者会感觉单调、没有空间感。所以问题就来了,学挖掘......

好了,言是正传。在Cool Edit等专业音频软件中,是有把单声道音频做出双声道效果的工具的,那他们是怎么做到的呢?

比如在把音声道音频导入Cool Edit后,进入单轨模式,按F11,转换成16位立体声格式。进入单轨模式,选择DirectX效果器下面Ultrafunk Fx里的Phase R3声相效果器。在预置里的sontius fx的子菜单下选择mono to stereo,把相关参数设好就可以把音频转成立体声效果了。


其实,这里的做法很简单,对左右声道的音频做个相位差就好了。废话少说,上代码


//

//  MyStereoEffect.h

//  MobileKtv

//

//  Created by MingJianhua on 14-6-23.

//  http://www.mingjianhua.com

//  http://www.appunions.cn


#ifndef __MobileKtv__MyStereoEffect__

#define __MobileKtv__MyStereoEffect__


#include <iostream>

#include <queue>

class MyStereoEffect

{

public:

    MyStereoEffect();

    ~MyStereoEffect();

    void    SetSampleRate(int nSampleRate);//可不设,默认44100

    int     GetSampleRate();

    void    SetDelay(int nDelay);//可不设默认5毫秒

    int     GetDelay();

    void    SetBalance(float fBalance);//可不设,默认0.7

    float   GetBalance();

    void    Process(short dataIn[],

                    short dataOut[],

                    int samples);

private:

    bool    m_bLock;

    double m_nSampleRate;

    double m_nDelay;

    double m_fBalance;

    

    std::queue<short> m_echoBufferQueue;

};

#endif /* defined(__MobileKtv__MyStereoEffect__) */





//

//  MyStereoEffect.h

//  MobileKtv

//

//  Created by MingJianhua on 14-6-23.

//  http://www.mingjianhua.com

//  http://www.appunions.cn



#include "MyStereoEffect.h"

MyStereoEffect::MyStereoEffect()

{

    m_nSampleRate = 44100;

    m_nDelay = 5;

    m_fBalance = 0.7;

    m_bLock = false;

    //以下用于左右声道延迟加相位差

    while (!m_echoBufferQueue.empty()) {

        m_echoBufferQueue.pop();

    }

    for (int i = 0; i<221; i++)//先填充5毫秒空数据

    {

        m_echoBufferQueue.push(0);

    }

}

MyStereoEffect::~MyStereoEffect()

{

    

}

void MyStereoEffect::SetSampleRate(int nSampleRate)

{

    m_nSampleRate = nSampleRate;

}

int MyStereoEffect::GetSampleRate()

{

    return m_nSampleRate;

}


void MyStereoEffect::SetDelay(int nDelay)

{

    while (m_bLock) {

        usleep(10000);

    }

    m_bLock = true;

    m_nDelay = nDelay;

    int nSamples = m_nSampleRate*nDelay/1000;

    int nSize =m_echoBufferQueue.size();

    if(nSize>nSamples)

    {

        for (int i = 0; i<nSize - nSamples; i++) {

            if (!m_echoBufferQueue.empty()) {

                m_echoBufferQueue.pop();

            }

        }

    }

    else if(nSize<nSamples)

    {

        for (int i = 0; i<nSamples - nSize; i++) {

            m_echoBufferQueue.push(0);

        }

    }

    m_bLock = false;

}

int MyStereoEffect::GetDelay()

{

    return m_nDelay;

}


void MyStereoEffect::SetBalance(float fBalance)

{

    m_fBalance = fBalance;

}

float MyStereoEffect::GetBalance()

{

    return m_fBalance;

}


void MyStereoEffect::Process(short dataIn[],

                           short dataOut[],

                           int samples)//单声道

{

    if (dataIn == NULL || dataOut == NULL ) {

        return;

    }

    while (m_bLock) {

        usleep(10000);

    }

    short temp = 0;

    //printf("m_echoBufferQueue.size() = %ld", m_echoBufferQueue.size());

    for (int i = 0; i<samples; i++) {

        int i_0 = i<<1;//i*2,左声道

        int i_1 = i_0+1;//i*2+1,右声道

        dataOut[i_1] = dataIn[i];//右声道不动

        if ((m_fBalance < 0.52 && m_fBalance>0.48)|| m_nDelay<2 ) {//如果左右调到接近相等,或延迟过小,则不进行计算

            dataOut[i_0] = dataIn[i];//左声道也不动

        }

        else

        {

            m_echoBufferQueue.push(dataIn[i]);

            dataOut[i_0] = m_echoBufferQueue.front();//左声道延迟delay毫秒

            m_echoBufferQueue.pop();

            

            temp = dataOut[i_0];

            dataOut[i_0] = dataOut[i_0]*m_fBalance + dataOut[i_1]*(1-m_fBalance);

            dataOut[i_1] = temp*(1-m_fBalance) + dataOut[i_1]*m_fBalance;

        }

    }

    m_bLock = false;

}


« 上一篇下一篇 »

评论列表:

1.合作  2015-6-16 8:26:59 回复该留言
您好,我姓张,我们是做智能音响的,希望有机会能和您合作,近期计划上创新产品,想尽快联系您,我的联系方式是sgt_leo_zyh@126.com qq397767716,麻烦您提供下联系方式,谢谢!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。