#include "WindowFunction.h"
#include <math.h>
#include <stdlib.h>
#if prod_Flag
/*函数名:taylorWin
*说明:计算泰勒窗。泰勒加权函数
*输入:
*输出:
*返回:
*调用:prod()连乘函数
*其它:用过以后,需要手动释放掉*w的内存空间
* 调用示例:ret = taylorWin(99, 4, 40, &w); 注意此处的40是正数 表示-40dB
*/
dspErrorStatus taylorWin(dspUint_16 N, dspUint_16 nbar, dspDouble sll, dspDouble **w)
{
dspDouble A;
dspDouble *retDspDouble;
dspDouble *sf;
dspDouble *result;
dspDouble alpha, beta, theta;
dspUint_16 i, j;
/*A = R cosh(PI, A) = R*/
A = (dspDouble)acosh(pow((dspDouble)10.0, (dspDouble)sll / 20.0)) / PI;
A = A * A;
/*开出存放系数的空间*/
retDspDouble = (dspDouble *)malloc(sizeof(dspDouble) * (nbar - 1));
if (retDspDouble == NULL)
return DSP_ERROR;
sf = retDspDouble;
/*开出存放系数的空间*/
retDspDouble = (dspDouble *)malloc(sizeof(dspDouble) * N);
if (retDspDouble == NULL)
return DSP_ERROR;
result = retDspDouble;
alpha = prod(1, 1, (nbar - 1));
alpha *= alpha;
beta = (dspDouble)nbar / sqrt(A + pow((nbar - 0.5), 2));
for (i = 1; i <= (nbar - 1); i++)
{
*(sf + i - 1) = prod(1, 1, (nbar - 1 + i)) * prod(1, 1, (nbar - 1 - i));
theta = 1;
for (j = 1; j <= (nbar - 1); j++)
{
theta *= 1 - (dspDouble)(i * i) / (beta * beta * (A + (j - 0.5) * (j - 0.5)));
}
*(sf + i - 1) = alpha * (dspDouble)theta / (*(sf + i - 1));
}
/*奇数阶*/
if ((N % 2) == 1)
{
for (i = 0; i < N; i++)
{
alpha = 0;
for (j = 1; j <= (nbar - 1); j++)
{
alpha += (*(sf + j - 1)) * cos(2 * PI * j * (dspDouble)(i - ((N - 1) / 2)) / N);
}
*(result + i) = 1 + 2 * alpha;
}
}
/*偶数阶*/
else
{
for (i = 0; i < N; i++)
{
alpha = 0;
for (j = 1; j <= (nbar - 1); j++)
{
alpha += (*(sf + j - 1)) * cos(PI * j * (dspDouble)(2 * (i - (N / 2)) + 1) / N);
}
*(result + i) = 1 + 2 * alpha;
}
}
*w = result;
free(sf);
return DSP_SUCESS;
}
#endif
/*
*函数名:triangularWin
*说明:计算三角窗函数
*输入:
*输出:
*返回:
*调用:
*调用示例:ret = triangularWin(99, w);
*/
dspErrorStatus triangularWin(uint16_t N, double w[])
{
uint16_t i;
/*阶数为奇*/
if ((N % 2) == 1)
{
for (i = 0; i < ((N - 1) / 2); i++)
{
w[i] = 2 * (double)(i + 1) / (N + 1);
}
for (i = ((N - 1) / 2); i < N; i++)
{
w[i] = 2 * (double)(N - i) / (N + 1);
}
}
/*阶数为偶*/
else
{
for (i = 0; i < (N / 2); i++)
{
w[i] = (i + i + 1) * (double)1 / N;
}
for (i = (N / 2); i < N; i++)
{
w[i] = w[N - 1 - i];
}
}
return DSP_SUCESS;
}
#if linSpace_Flag
/*
*函数名:tukeyWin
*说明:计算tukey窗函数
*输入:
*输出:
*返回:linSpace()
*调用:
*其它:用过以后,需要手动释放掉*w的内存空间
* 调用示例:ret = tukeyWin(99, 0.5, &w);
*/
dspErrorStatus tukeyWin(dspUint_16 N, dspDouble r, dspDouble **w)
{
dspErrorStatus retErrorStatus;
dspUint_16 index;
dspDouble *x, *result, *retPtr;
dspDouble alpha;
retErrorStatus = linSpace(0, 1, N, &x);
if (retErrorStatus == DSP_ERROR)
return DSP_ERROR;
result = (dspDouble *)malloc(N * sizeof(dspDouble));
if (result == NULL)
return DSP_ERROR;
/*r <= 0 就是矩形窗*/
if (r <= 0)
{
retErrorStatus = rectangularWin(N, &retPtr);
if (retErrorStatus == DSP_ERROR)
return DSP_ERROR;
/*将数据拷出来以后,释放调用的窗函数的空间*/
memcpy(result, retPtr, (N * sizeof(dspDouble)));
free(retPtr);
}
/*r >= 1 就是汉宁窗*/
else if (r >= 1)
{
retErrorStatus = hannWin(N, &retPtr);
if (retErrorStatus == DSP_ERROR)
return DSP_ERROR;
/*将数据拷出来以后,释放调用的窗函数的空间*/
memcpy(result, retPtr, (N * sizeof(dspDouble)));
free(retPtr);
}
else
{
for (index = 0; index < N; index++)
{
alpha = *(x + index);
if (alpha < (r / 2))
{
*(result + index) = (dspDouble)(1 + cos(2 * PI * (dspDouble)(alpha - (dspDouble)r / 2) / r)) / 2;
}
else if ((alpha >= (r / 2)) && (alpha <(1 - r / 2)))
{
*(result + index) = 1;
}
else
{
*(result + index) = (dspDouble)(1 + cos(2 * PI * (dspDouble)(alpha - 1 + (dspDouble)r / 2) / r)) / 2;
}
}
}
free(x);
*w = result;
return DSP_SUCESS;
}
#endif
/*
*函数名:bartlettWin
*说明:计算bartlettWin窗函数
*输入:
*输出:
*返回:
*调用:
*调用示例:ret = bartlettWin(99, w);
*/
dspErrorStatus bartlettWin(uint16_t N, double w[])
{
uint16_t n;
for (n = 0; n < (N - 1) / 2; n++)
{
w[n] = 2 * (double)n / (N - 1);
}
for (n = (N - 1) / 2; n < N; n++)
{
w[n] = 2 - 2 * (double)n / ((N - 1));
}
return DSP_SUCESS;
}
/*
*函数名:bartLettHannWin
*说明:计算bartLettHannWin窗函数
*输入:
*输出:
*返回:
*调用:
*调用示例:ret = bartLettHannWin(99, w);
*/
dspErrorStatus bartLettHannWin(uint16_t N, double w[])
{
uint16_t n;
/*奇*/
if ((N % 2) == 1)
{
for (n = 0; n < N; n++)
{
w[n] = 0.62 - 0.48 * fabs(((double)n / (N - 1)) - 0.5) + 0.38 * cos(2 * PI * (((double)n / (N - 1)) - 0.5));
}
for (n = 0; n < (N - 1) / 2; n++)
{
w[n] = w[N - 1 - n];
}
}
/*偶*/
else
{
for (n = 0; n < N; n++)
{
w[n] = 0.62 - 0.48 * fabs(((double)n / (N - 1)) - 0.5) + 0.38 * cos(2 * PI * (((double)n / (N - 1)) - 0.5));
}
for (n = 0; n < N / 2; n++)
{
w[n] = w[N - 1 - n];
}
}
return DSP_SUCESS;
}
/*
*函数名:blackManWin
*说明:计算blackManWin窗函数
*输入:
*输出:
*返回:
*调用:
*调用示例:ret = blackManWin(99, w);
*/
dspErrorStatus blackManWin(uint16_t N, double w[])
{
uint16_t n;
for (n = 0; n < N; n++)
{
w[n] = 0.42 - 0.5 * cos(2 * PI * (double)n / (N - 1)) + 0.08 * cos(4 * PI * (do
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论













收起资源包目录





































































































共 116 条
- 1
- 2
资源评论


飛越無限
- 粉丝: 262
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 软件测试工程师的疑惑.doc
- 供电系统安全管理.doc
- 烟草专卖局(公司)年度信息系统安全检查工作自查报告.doc
- 网络舆情管理信息系统技术方案.doc
- 电子商务专业英语词汇表.doc
- assembly_learning-汇编语言资源
- 网站需求说明书软件工程课程设计.doc
- 服务热线网络管理平台(DOC页).docx
- 动态规划算法原理与的应用.doc
- 2023年MSoffice计算机二级考点.docx
- 用友软件食品行业烘焙细分行业ERP信息化解决方案.doc
- 网络营销调研培训教材.pptx
- 信息安全与计算机病毒的防范教材.pptx
- 供应链网络设计.ppt
- 自考数据库系统原理04735真题模拟含答案.doc
- 北京交通大学微机原理与接口技术作业答案.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
