目录
- 1.函数源码
- 2.visual studio2022代码编译前环境配置
- 3.FFTW链接库编译
- 4.函数计算结果与matlab chebwin函数结果对比
1.函数源码
基于VS和C/C++语言的切比雪夫窗(chebwin)函数计算利用了fftw库,所以在运行下列代码之前,需要提前做好fftw链接库的编译工作。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <vector> #include <fftw3.h> #define M_PI 3.14159265358979323846 #define M_EPS 1e-8 /****************************************************************** * Description: 切比雪夫窗函数 chebwin * * Parameter List: * @ M:期望输出长度 * @ r:衰减参数 *******************************************************************/ std::vector<double> chebwin(int M, double r) { std::vector<double> win(M); double order = M - 1.0; double beta = cosh(1.0 / order * acosh(pow(10, (abs(r) / 20.)))); double* x = new double[M]; for (int i = 0; i < M; i++) { double temp = cos(M_PI * i / M) * beta; if (temp > 1) { temp = cosh(order * acosh(temp)); } else if (temp < -1) { temp = (2 * (M % 2) - 1) * cosh(order * acosh(-temp)); } else { temp = cos(order * acos(temp)); } x[i] = temp; } fftw_complex* fftIn = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * M); fftw_complex* fftOut = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * M); fftw_plan plan = fftw_plan_dft_1d(M, fftIn, fftOut, FFTW_FORWARD, FFTW_MEASURE); double maxvalue(-1e8); if (M % 2)//M 为奇数 { for (int j = 0; j < M; j++) { fftIn[j][0] = x[j]; fftIn[j][1] = 0; } fftw_execute(plan); int n = (M + 1) / 2; win[n - 1] = fftOut[0][0]; maxvalue = fftOut[0][0]; for (int j = n - 1; j >= 1; j--) { win[n - 1 - j] = fftOut[j][0]; win[j + n - 1] = fftOut[j][0]; if (maxvalue < fftOut[j][0]) { maxvalue = fftOut[j][0]; } } } else { for (int j = 0; j < M; j++) { fftIn[j][0] = x[j] * cos(M_PI / M * j); fftIn[j][1] = x[j] * sin(M_PI / M * j); } fftw_execute(plan); int n = M / 2 + 1; for (int j = n - 1; j >= 1; j--) { win[n - 1 - j] = fftOut[j][0]; win[j + n - 2] = fftOut[j][0]; if (maxvalue < fftOut[j][0]) { maxvalue = fftOut[j][0]; } } } for (int j = 0; j < M; j++) { win[j] = win[j] / maxvalue; } delete[] x; x = nullptr; fftw_destroy_plan(plan); fftw_free(fftIn); fftw_free(fftOut); return win; } int main() { int size = 71; double attenuation = 60; std::vector<double> chebwin_out = chebwin(size, attenuation); for (int i = 0; i < chebwin_out.size(); i++) { std::cout << chebwin_out[i] << std::endl; } return 0; }
2.visual studio2022代码编译前环境配置
1.利用vs2022创建C++命令行应用项目。将编译的FFTW链接库文件复制到项目根目录内。
2.在项目根目录创建include文件夹,将其中fftw3.h文件剪切到include文件夹内。
3.从项目“解决方案”右键,点击最下方“属性”。
4.选择”VC++目录“,点击右侧”包含目录“,点击”编辑“。
5.点击右上方文件夹图标选择include文件夹所在绝对路径,或直接在下方输入相对路径“include”,点击确定。
6.点击“链接器”–“输入”–“附加依赖项”,点击“编辑”。
7.添加“libfftw3-3.lib”文件,fftw库编译结果有三个lib文件,分别对应不同精度的版本,如不确定自己需要的,可以三个一起放进依赖项中。点击“确定”。
8.点击下方“确定”保存设置,至此切比雪夫窗计算所需要的环境已经配置成功,配置环境时注意属性栏左上方“配置”的debug还是release版本,编译时注意对应版本。
9.配置完上述环境后,即可复制完整代码,直接运行。参数接口同matlab chebwin函数。
3.FFTW链接库编译
1.下载链接: http://www.fftw.org/install/windows.html
2.根据自己系统位数下载对应压缩包,在此选择64位版本(红色框选部分)。
3.解压fftw-3.3.5-dll64.zip压缩文件。
4.利用windows自带的搜索功能,搜索“x64_x86 Cross Tools Command Prompt for VS 2022”。
5.打开命令行窗口,并利用cd+fftw解压文件存储路径,单机“回车”进入到下载文件夹内。如正确输入路径还没有进到文件夹,假设你的存储盘符D盘,输入"D:",单机“回车”即可进入。
6.命令行内分别输入下列三行代码,即可得到x64版本链接库文件。正确执行后的命令行页面如下。
lib /machine:x64 /def:libfftw3-3.def lib /machine:x64 /def:libfftw3l-3.def lib /machine:x64 /def:libfftw3f-3.def
如压缩包下载的是32位 x86版本,请执行下列三行代码:
lib /def:libfftw3-3.def lib /def:libfftw3f-3.def lib /def:libfftw3l-3.def
7.正确执行上述代码后,文件夹内会额外生成下列文件。
8.从文件夹内取出下列文件用于切比雪夫窗的仿真工作。下列文件即为fftw3链接库内容。
4.函数计算结果与matlab chebwin函数结果对比
1.本功能函数测试用例计算结果与matlab chebwin函数同参数计算结果曲线对比
2.计算结果部分数值对比