DCTI公司是离散类比的实现之一余弦傅里叶操作人员
DCTII这个名字的选择与维基百科类似[1]和符号C中的数字配方
[2].
DCTI或I类离散Cos变换是正交变换,用于替换数组长度的包含元素,到阵列包含元素
- 对于
规范化表单
正交化变换可以用运算符定义,作用于数组按以下方式:
操作员是它自己的反面;
数字实现
这个C类++第一类离散cos变换的数值实现由3个文件组成zfour1.cin公司,zrealft.cin公司,zcosft1.cin公司; 为了编译示例,应该将这些文件加载到工作目录。对于波动光学的应用,z类型应定义为双“或复合(双); 然而,对于其他应用,也可以用其他方式定义这种类型。函数的名称和参数的意义由C中的数字配方,数组变换的调用长度的具有表单zcosft1(F-1,N);在这样的调用之后,数组元素的值替换为使用上述表达式(1)计算的值。对于,评估要求的顺序为操作
这个余弦傅立叶运算符转换函数函数的非负参数按以下方式:
对于这个算子的离散近似,假设一些较大的自然数.让.Let函数平滑并在无穷远处快速衰减。然后可以近似如下:
对于,可以这样写:
-
在转换时,假设可以忽略为.以这种方式,
余弦傅里叶逼近的数值检验
文件夹zfour1.cin公司,zrealft.cin公司,zcosft1.cin公司应该加载到工作目录,以便编译下面的测试文件。
示例的数值实现余弦傅里叶下面建议使用上一节中描述的近似变换。自傅里叶函数的C++数值余弦傅里叶变换可以实现如下:
#包括<math.h>#包括<stdio.h>#包括<stdlib.h>//#包括<复杂>//使用命名空间标准;#定义z_type双精度#包括“zfour1.cin”#包括“zrealft.cin”#包括“zcosft1.cin”main(){z_type*a,*b;int j,k,N=16;双d,x,y;a=(z_type*)malloc((size_t)((N+1)*sizeof(z_type)));b=(z_type*)malloc((size_t)((N+1)*sizeof(z_type)));d=平方英尺(M_PI/N);对于(j=0;j<N+1;j++){x=j*d;a[j]=b[j]=exp(-x*x/2);}zcosft1(a-1,N);对于(j=0;j<N+1;j++)a[j]*=sqrt(2./N);对于(j=0;j<N+1;j++)printf(“%12.9f%12.9f%22.9f%11.4e\N”,j*d,a[j],b[j]、a[j]-b[j]);免费(a);自由(b);}
上述代码生成以下输出:
0.0000000001.0000000001.000000-2.3238e-120.443113463 0.906490462 0.906490962 2.3206e-120.886226925 0.675231907 0.6752319007-2.3094e-121.329340388 0.413303564 0.413303564 2.2924e-121.772453851 0.207879576 0.2078795076-2.2688e-122.215567314 0.085917370 0.0859173 70 2.2417e-122.658680776 0.029179416 0.02917941-2.2100e-123.101794239 0.008143268 0.008143268 2.1780e-123.544907702 0.001867443 0.001867443-2.1444e-123.988021165 0.000351903 0.0003511903 2.1124e-124.431134627 0.000054491 0.000054491-2.0815e-124.874248090 0.000006933 0.0000069332.0543e-125.317361553 0.000000725 0.000000725-2.0309e-125.760475015 0.000000062 0.000000062 2.0121e-126.203588478 0.000000004 0.000000004-1.9832e-126.646701941 0.000000000 0.000000000 2.4651e-127.089815404 0.0000000000.0000000001.0175e-11
第0列表示坐标,以下两个–其DTFI和输入函数,最后一个显示用DTFI例程逼近余弦傅里叶算子。
示例表明,对于最简单的自傅里叶函数,17节点近似给出了12位正确的十进制数字。
对于上述代码的分析,应注意,自傅里叶函数是傅里叶算子特征值为1;
四级效率的评估
让是带周期实变元的偶数周期函数:
- ,
然后,傅里叶级数的展开式可以写成
傅里叶系数
- ,
假设某个较大的自然数.让.系数的近似值,将积分替换为有限和:
- ,
与方程式(1)的比较得出
- ,
给定膨胀系数,网格上的函数可以使用进行评估,使用和对于.
傅里叶级数展开的数值试验
让.让。膨胀系数预计为,,; 所有其他系数预计为零。上述近似值可以在C类++具有以下代码:
#包括<math.h>#包括<stdio.h>#包括<stdlib.h>#定义z_type双精度#包括“zfour1.cin”#包括“zrealft.cin”#包括“zcosft1.cin”main(){z_type*a,*b,*c;int j,k,N=8;双d,x,y;a=(z_type*)malloc((size_t)((N+1)*sizeof(z_type)));b=(z_type*)malloc((size_t)((N+1)*sizeof(z_type)));c=(z_type*)malloc((size_t)((N+1)*sizeof(z_type)));d=M_PI/N;对于(j=0;j<N+1;j++){x=j*d;a[j]=b[j]=1.+.1*cos(x)+.01*coszcosft1(a-1,N);对于(j=0;j<N+1;j++)c[j]=a[j];zcosft1(a-1,N);对于(j=0;j<N+1;j++)printf(“%2d%12.9f%12.9f%12.9f\N”,j,b[j],c[j],a[j]);免费(a);自由(b);}
上面的代码可以用文件编译zfour1.cin公司,zrealft.cin公司,zcosft1.cin公司并生成以下输出:
0 1.110000000 8.000000000 4.4400000001 1.099459021 0.400000000 4.3978360842 1.070710678 0.040000000 4.2828427123 1.031197275 -0.000000000 4.1247891024 0.990000000 0.000000000 3.9600000005 0.954660589 -0.000000000 3.8186423566 0.929289322 -0.000000000 3.7171572887 0.914683115 -0.000000000 3.6587324588 0.910000000 0.000000000 3.640000000
第0列仅为网格的节点编号。
第一列显示初始函数。
2d列表示DCTI公司初始函数的转换。此列中的数字是初始函数中使用的傅里叶系数乘以因子.最后一列是运算符附加应用的结果DCTI公司和表示函数的相同初始值乘以相同因子。
结论
可用于评估余弦傅里叶等距函数值数组上的运算符,假设函数连续且在无穷远处平滑衰减。数组应该具有元素,并且计数应该以零开始。
相同的离散运算符可用于计算傅里叶系数对称周期函数,以及通过给定的傅里叶系数对函数进行截断计算傅里叶级数.
数值实现对于对一些人来说自然数 . TheC类++实现存储在例程中zfour1.cin公司,zrealft.cin公司,zcosft1.cin公司; 它们可以复制并包含到用户代码中,而无需任何“安装”。为了处理实数,输入z类型可以定义为“double”;为了处理复数,它可以定义为复合(双).
工具书类
本条内容采用自http://tori.ils.uec.ac.jp/tori/index.php/DCTI网站