qt使用sp++开源库绘制语频图和频谱图

  • Post author:
  • Post category:其他


效果如下:

在这里插入图片描述
在这里插入图片描述

正所谓前任栽树后人乘凉 sp++如何引用不再赘述,由于首次接触信号处理方面的东西(知其然不知其所以然)结果也是试出来的

频谱图

利用的是库函数welchPSE进行计算

%d 需要计算的信号数据

%key x轴时间(us)

%value y轴(dbfs) 如果需要db value[i]=10

log10(Ps[i]/(sampling_rate)

(ENBW));

%windows_type 窗口参数类型

bool matlab_manager::calc_power_spectrum(splab::Vector<double> &d, QVector<double> &key, QVector<double> &value, const windows_type m_window)
{
    int d_size=d.size();
    if(d_size<MIN_PONIT_SIZE)return false;

    int wn_length=m_window.length<d_size?m_window.length:(d_size-1);

    Vector<double> wn =window(m_window.name.toStdString(),wn_length, double(2.0));

    if(wnPower==0)
        cal_power_wnArea(wn);

     const double ENBW = sampling_rate*power_wnArea /pow(wn_length, 2);//窗口等效噪声带宽


    Vector<double> Ps = welchPSE(d,wn,wn_length/2,wn_length+1);

    int result_size=Ps.size()/2;
    value.resize(result_size);
    key.resize(result_size);
    for(int i=0;i<result_size;++i)
    {
        value[i]=10*log10(Ps[i]/(sampling_rate)*(ENBW)) - 20*log10(4096);//除以采样率*窗口等效噪声带宽
        key[i]=i/(double)result_size*(sampling_rate/2);
    }
    Ps.destroy();
    return true;
}

(时频图)语频图  ---网上有些说一样有些说不一样 不太懂
利用的是库函数dgt wft进行计算wft适合小量数据 dgt对数据进行了重采样适合大数据的处理
bool matlab_manager::calc_speech_frequency_addWindowFourier(splab::Vector<double> &d, splab::Matrix<complex<double>> &value,const windows_type m_window)
{
    int d_size=d.size();
    if(d_size<MIN_PONIT_SIZE)return false;

    Vector<double> wn =window(m_window.name.toStdString(),m_window.length, double(1.0));

    value = wft(d,wn,"ppd");

    switchToDb(value);


    return true;
}

bool matlab_manager::calc_speech_frequency_dispersedGabor(splab::Vector<double> &d, splab::Matrix<splab::complex<double> > &value, const windows_type m_window)
{
    int d_size=d.size();
    if(d_size<MIN_PONIT_SIZE)return false;
    Vector<Type> wn = window("Gauss",m_window.length,m_window.alpha,m_window.amp);
    wn = wn / norm(wn);
    Vector<Type> g = daul( wn, m_window.length, m_window.length/2 );

    value = dgt(d, wn, N, dM, "sym" );

    switchToDb(value);

    wn.destroy();

    return true;
}

void matlab_manager::switchToDb(splab::Matrix<splab::complex<double> > &value)
{
    double max_v=-150;
    for(int row=0;row<value.rows();row++)
    {
        for(int column=0;column<value.cols();column++)
        {
            value[row][column]=std::sqrt(std::pow(value[row][column].real(),2)+std::pow(value[row][column].imag(),2));
            if(value[row][column].real()>max_v)
                max_v=value[row][column].real();
        }
    }

    for(int row=0;row<value.rows();row++)
    {
        for(int column=0;column<value.cols();column++)
        {
            double val=abs(value[row][column].real())/max_v;
            value[row][column]=20*log10(val);
        }
    }
}



版权声明:本文为qq_44257811原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。