大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
数学上,一个光滑函数(smooth function)是一个无穷可微的函数,也就是说,有所有有限阶的导数。函数称为C类,如果它是一个连续函数。函数是C1类的,如果它有一个连续导数;这样的函数也称为连续可微。一个函数称为Cn类(对于n ≥ 1)如果它可以微分n次,并且n阶导数连续。因而光滑函数是对所有n属于Cn类的函数。它们也称为C∞函数。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了呼中免费建站欢迎大家使用!
例如,指数函数显然是光滑的,因为指数函数的导数是指数函数本身
这个程序的错误有两个,都不在语法上,而在逻辑上。
第一个错误:以x = 1:10为例,即N = 10,当i=1时,if条件下i=5为假,但是i=N-4却为真,因此进入if下的for循环,而此时j = -3:5,我们知道j=-3是不能够作为数组下标的,因此会报错。
第二个错误:现在我们修改第一个错误,把或“|”改成了且“”。仍是以x = 1:10为例, 当i=5的时候,我们成功进入第一个if,经过for循环以后,我们得到y(5) = 5,没有问题。但是注意此时的sum是有值的,没有因为跳出循环而清零。所以当i=6的时候,我们再次进入if下的for循环,此时的sum并不是从零开始加,因此会得到y(6)=11,而这明显是错误的。
所以,正确的code应该是:
function y = smooth_data(x)
N=size(x,1);
for i=1:N
if i=5 i=N-4
sum=0;
for j=(i-4):(i+4)
sum = sum + x(j,1);
end
y(i,1)=sum/9;
else
y(i,1)=x(i,1);
end
end
SMOOTH N函数被视为一个离散延迟函数,因此它的输出对于每个Time Step都是恒定的。如果你用欧拉或Diff积分这对所有变量都成立。然而,如果你使用龙格-库塔积分,这是不同的函数,如SMOOTH3。
SMOOTH N函数不保存数量。如果你想保存流量,请参阅DELAY N。
注意,为了使SMOOTH N函数有意义,延迟时间必须大于order* time STEP。如果不是这样,Vensim将发出警告并自动减少订单,使其为真。当这种情况发生时,平滑N函数的行为本质上与DELAY INFORMATION函数的行为相同。
smooth函数的本质就是低通滤波,就是通过低通滤波算法吧输入信号中的高频成分移除。
yy
=
smooth(y,method)
Matlab有以下几种方法method供选择:
'moving'就是所谓的平滑滤波。简单的平均而已
'lowess'一阶多项式加权线性回归
'loess'一阶多项式加权线性回归
'rlowess'同'lowess',但是自适应调整权值
'rloess'同'loess',但是自适应调整权值
如果以上方法不能满意,可以matlab中的fit函数进行平滑
额 我的数字信号处理学的很差,但是我大概了解了下,是不是这个意思首先由两个sin函数构成了一个输入信号,在数字信号处理中叫做激励的东西,然后您给了一个平滑滤波的公式,于是您期望输出信号,也就是信号与系统中所说的Y(z)=H(z)*X(z)如果是的话。那么我就上图了。
首先我成功完成您所给的例子中的数据,由于其中关于序列长度的问题,我设定长度为128,这个和设定50没有什么区别,那么实现您期望的功能需要两个基本块和两个存储信号序列的数组,块1是如何生成一个smooth函数:
如下我写的语句,实现了一个smooth函数,该函数需要的 i,j,N即为公式中所提及的,InSignalBuffer则是一个输入参数,内部装有已经形成的序列,就是sin(0.05*Pi*x)+0.1*sin(0.7*Pi*x);所形成的的序列。OutSignalBuffer是经过smooth处理后这个点的值存到哪里,我用的指针表示。
int Smooth(int i,int j,int N,float *InSignalBuffer,float *OutSignalBuffer)
{
float Reg=0;
for(i=j;i=j+N-1;i++)
{
Reg+=*(InSignalBuffer+i);
}
Reg=Reg/(double)N;
i=j;
OutSignalBuffer[i]=Reg;
return 0;
}
块2,如何生成激励函数,也就是之前您提及的离散信号序列的公式。如下函数,输入N以确定序列长度,之后计算出一条序列,将其存放到*OutSignalBuffer地址中。
int ExcitationSignal(int N,float *OutSignalBuffer)
{
float Pi=3.14;
float x=0;
int i;
for(i=0;i=N;i++,x++)
{
*(OutSignalBuffer+i)=sin(0.05*Pi*x)+0.1*sin(0.7*Pi*x); }
return 0;
}
存放序列的问题,存放序列言外之意,就是建立数组,或者是malloc一段空间,为了有广泛性,所以我用的malloc。如下,为开辟两个内存存放离散信号和平滑好的信号。每种能存放128个点的数据。这个可以自己定。
float *InS;
InS=(float*)malloc(sizeof(float)*128);
float *OutS;
OutS=(float*)malloc(sizeof(float)*128);
我们看下函数主体:
其中我们已经说过开辟内存的问题了,那么ExcitationSignal(127,InS);就是生成一个128点的序列,从0-127的,所以是128点的。 Smooth(i,j,3,InS,OutS);从InS中取值然后经过运算有存入Outs中,这里就是3(如您所描述的:建议n值取3~4)。 Print(OutS,124);打印出先关值,也就是我的第一张图片所显示的。
void test()
{
float *InS;
InS=(float*)malloc(sizeof(float)*128);
float *OutS;
OutS=(float*)malloc(sizeof(float)*128);
ExcitationSignal(127,InS);
//Print(InS,127);
int j,i;
for(j=0;j124;j++)
Smooth(i,j,3,InS,OutS);
Print(OutS,124);
}
int main(void)
{
test();
getchar();
return 0;
}
那么全部如下了:
#include windows.h
#include stdio.h
#include math.h
int Smooth(int i,int j,int N,float *InSignalBuffer,float *OutSignalBuffer)
{
float Reg=0;
for(i=j;i=j+N-1;i++)
{
Reg+=*(InSignalBuffer+i);
}
Reg=Reg/(double)N;
i=j;
OutSignalBuffer[i]=Reg;
return 0;
}
int ExcitationSignal(int N,float *OutSignalBuffer)
{
float Pi=3.14;
float x=0;
int i;
for(i=0;i=N;i++,x++)
{
*(OutSignalBuffer+i)=sin(0.05*Pi*x)+0.1*sin(0.7*Pi*x);
}
return 0;
}
void Print(float *Buffer,int N)
{
int i=0;
for(i=0;iN;i++)
printf("\t[%d]\t[%f]\n",i,*(Buffer+i));
}
void test()
{
float *InS;
InS=(float*)malloc(sizeof(float)*128);
float *OutS;
OutS=(float*)malloc(sizeof(float)*128);
ExcitationSignal(127,InS);
//Print(InS,127);
int j,i;
for(j=0;j124;j++)
Smooth(i,j,3,InS,OutS);
Print(OutS,124);
}
int main(void)
{
test();
getchar();
return 0;
}
我程序中子函数中malloc但是没有free,你可以看情况free下。