#include <math.h>
#include "mex.h"
/**
See curve_ext.m for help on using this MEX code.
Original Author: Jianfeng Lu (now at NYU CIMS)
Maintainer: Eugene Brevdo
--------------------------------------------------------------------------------
Synchrosqueezing Toolbox
Authors: Eugene Brevdo (http://www.math.princeton.edu/~ebrevdo/),
Hau-Tieng Wu,
---------------------------------------------------------------------------------
*/
/**
Calculate distance between frequencies on frequency scale
given by vector fs
**/
double fdist(double* fs, int i, int j) {
return (fs[i]-fs[j])*(fs[i]-fs[j]);
}
/**
Extract a maximum energy, minimum curvature curve from
Synchrosqueezed Representation. Note, energy is given as:
abs(Tx).^2
Original Author: Jianfeng Lu (now at NYU CIMS)
Current Version: Eugene Brevdo
Usage:
[C,E] = curve_ext(Tx, log2(fs), lambda);
lambda should be >=0. Default: lambda=0
**/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
double *Txr, *Txi, *fs;
int N,na;
double lambda;
int *Freq;
double *FreqOut;
double *EnergyOut;
double *FValOut;
double *Energy, *FVal;
double minval, val;
int i,j,k;
const double eps = 1e-8;
double sum = 0;
/* Portal to matlab */
Txr = mxGetPr(prhs[0]);
Txi = mxGetPi(prhs[0]);
na = mxGetM(prhs[0]);
N = mxGetN(prhs[0]);
/* Get frequencies */
fs = mxGetPr(prhs[1]);
lambda = mxGetScalar(prhs[2]);
plhs[0] = mxCreateNumericArray(1,&N,mxDOUBLE_CLASS,mxREAL);
plhs[1] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
FreqOut = mxGetPr(plhs[0]);
EnergyOut = mxGetPr(plhs[1]);
Energy = (double *)mxMalloc(sizeof(double)*N*na);
FVal = (double *)mxMalloc(sizeof(double)*N*na);
Freq = (int *)mxMalloc(sizeof(int)*N);
/**
Calculate in terms of energy - more numerically stable
**/
for (i=0;i<N;++i) {
for (j=0;j<na;++j) {
if (Txr != NULL)
Energy[i*na+j] = Txr[i*na+j]*Txr[i*na+j];
if (Txi != NULL)
Energy[i*na+j] += Txi[i*na+j]*Txi[i*na+j];
sum += Energy[i*na+j];
}
}
for (i=0;i<N;++i)
for (j=0;j<na;++j)
Energy[i*na+j] = -log(Energy[i*na+j]/sum+eps);
/**
Simple first order dynamic program: find minimum energy to
traverse from frequency bin j at time i to frequency bin k at
time i+1, where the energy cost is proportional to
lambda*dist(j,k)
**/
for (j=0;j<na;++j)
FVal[j] = Energy[j];
for (i=1;i<N;++i){
for (j=0;j<na;++j)
FVal[i*na+j] = mxGetInf(); /* INFINITY; */
for (j=0;j<na;++j){
for (k=0;k<na;++k)
if (FVal[i*na+j] > FVal[(i-1)*na+k]+lambda*fdist(fs, j, k))
FVal[i*na+j] = FVal[(i-1)*na+k]+lambda*fdist(fs, j, k);
FVal[i*na+j] += Energy[i*na+j];
}
}
/**
Find the locations for the minimum values of our energy
functional at each time location i. Store in freq.
**/
minval = FVal[(N-1)*na];
for (i=1;i<N;++i)
Freq[i] = -1;
Freq[N-1] = 0;
for (j=1;j<na;++j) {
if (FVal[(N-1)*na+j]<minval) {
minval = FVal[(N-1)*na+j];
Freq[N-1] = j;
}
}
/**
Back out from the end time N-1, calculating the indices of the
minimum negative-log-energy curve while we're at it.
**/
for (i=N-2;i>=0;--i){
if (Freq[i+1] == -1)
continue;
val = FVal[(i+1)*na+Freq[i+1]] - Energy[(i+1)*na+Freq[i+1]];
for (j=0;j<na;++j)
if (fabs((val-FVal[i*na+j]) - lambda*fdist(fs, j, Freq[i+1]))<eps) {
Freq[i] = j;
break;
}
}
for (i=0;i<N;++i)
FreqOut[i] = (double)Freq[i]+1.;
*EnergyOut = FVal[(N-1)*na + Freq[N-1]];
mxFree(Freq);
mxFree(Energy);
mxFree(FVal);
}


matlab科研助手
- 粉丝: 3w+
最新资源
- 基于Comsol仿真的涡流无损检测模型:频率、电导率、提离与线径对阻抗特性的影响
- 混合储能系统中MATLAB Simulink仿真的功率分配与波动抑制研究
- 60度坐标系下SVPWM仿真:简化运算过程与gh坐标变换的参考计算与效果验证
- 常微分方程与微分代数方程的数值方法
- 基于S7-200 PLC和组态王的水箱液位控制系统:梯形图程序、接线图、IO分配及组态画面解析
- 基于S7 300 PLC的车门包边机控制系统设计与实现:组态王组态、梯形图程序、接线图与IO分配全解析 梯形图 高级版
- 基于PLC的药片自动装瓶机控制系统设计:提升制药生产线效率与质量的关键技术
- 低速大转矩直驱力矩电机方案:为矿山机械等设备提供高效动力 分数槽集中绕组
- 电力系统风光出力场景生成与削减:蒙特卡洛模拟、拉丁超立方及快速前推法的应用
- 基于西门子PLC-1200的伺服电机控制传送带设计方案及其工业应用
- 三相电机FOC调制核心SVPWM技术:电压矢量与开关状态切换的多种实现方式 手册
- C# MQTT服务器源码解析:带Web API接口、持久化消息记录及在线用户查询功能
- 工业自动化中昆仑通态触摸屏与汇川变频器无线通讯技术的应用及实现
- 无线通信中OFDM系统PAPR降低算法(MATLAB仿真:PTS、SLM、C变换) - PAPR 详细版
- 基于S7系列PLC与组态王的三泵变频恒压供水系统设计及实现
- MATLAB Simulink仿真下并网型风光混储直流微电网的能量管理和优化存储技术研究
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


