效果如下:
正所谓前任栽树后人乘凉 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 版权协议,转载请附上原文出处链接和本声明。