切比雪夫窗C、C++实现,基于Visual Studio 2022、C/C++语言实现切比雪夫窗函数[结果与matlab w = chebwin(L,r)函数相同]

目录

  • 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.计算结果部分数值对比
在这里插入图片描述