为何输出老是出错,求助!

ruixiang6 2007-05-28 03:36:06
我写一个程序,是处理信号变换的,有一个函数,目的是看给出的周期参数是否是2的N次方,如果不是,则延长周期为其后最近的2的N次方,且相关信号量为0。
比如,我将信号周期设为3,则我输入前三个信号量为1,2,1,则输出为1,2,1,0,自动变成周期4,也就是2的2次方,第四个信号量为0。但不知为什么程序老是出错,补上的信号应为0,可是运行发现是个很大的数,请高人指点。

#include "stdafx.h"
#include "math.h"

void FFT(float a[], int M)
{
int MM;
for(int i=0;i<1000000;i++)
{
if((double)M>pow(2,(double)i))
;
else
{
MM=(int)pow(2,(double)i);
break;
}
}

for(int i=M+1;i<MM;i++)
{
a[i]=0;
}

for(int i=0;i<MM;i++)
{
printf("a[%d] = %f\n",i,a[i]);

}
}


int _tmain(int argc, _TCHAR* argv[])
{
float x[100];
int N;
printf("请输入信号的周期:\n");
scanf("%d",&N);

for(int i=0;i<N;i++)
{
printf("请输入第%d个数:\n",i+1);
scanf("%f",&x[i]);
}

printf("输入序列为:\n");

FFT(x,N);

return 0;
}
...全文
758 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruixiang6 2007-05-28
  • 打赏
  • 举报
回复
多谢1楼2楼指出错误。
更加感谢航航兄的扩展指导!
milksea 2007-05-28
  • 打赏
  • 举报
回复
for(int i=M+1;i<MM;i++)
{
a[i]=0;
}

如上所言,边界计算有误,并且用memset函数比较好:
memset(a + M, 0, (MM - M) * sizeof(a[0]));

信号处理这类程序是追求效率的,所以我多说了许多。
milksea 2007-05-28
  • 打赏
  • 举报
回复
还有,得到最近的2的N次方,可以用下面的方法:

Figure 3-3 Least power of 2 greater than or equal to x.

unsigned clp2(unsigned x) {
x = x - 1;
x = x | (x >> 1);
x = x | (x >> 2);
x = x | (x >> 4);
x = x | (x >> 8);
x = x | (x >>16);
return x + 1;
}
milksea 2007-05-28
  • 打赏
  • 举报
回复
要判断一个整数是否2的整数次方,有更简单有效的方法。相反,你的方式用了精确度不足的浮点运算,更可能有问题。

公式
x & (x + 1)
可以用来判断一个整数x是否为2的n次方减1的形式,此公式对0或各位全为1的式子都有效。例如
x = 11111(二进制)

x & (x + 1) = 011111 & 100000 = 0 (0值)
而若
x = 11011

x & (x + 1) = 11011 & 11100 = 11000 (非0)

剩下的就不多说了。

参考:《Hacker's Delight》,2-1 Manipulating Rightmost Bits。
mwlabxj 2007-05-28
  • 打赏
  • 举报
回复
哎,第一抢到沙发,嘿嘿
bargio_susie 2007-05-28
  • 打赏
  • 举报
回复
LS的正解,动作够快。。。。
for(i=M;i<MM;i++)
{
a[i]=0;
}
mwlabxj 2007-05-28
  • 打赏
  • 举报
回复
void FFT(float a[], int M)
里面
for(int i=M+1;i<MM;i++)
{
a[i]=0;
}
仔细分析你的程序,看出来当M=3时,MM=4;所以M+1=MM,那么循环就不会执行,应该把循环逻辑重新考虑,应该改为
for(int i=M;i<MM;i++)
{
a[i]=0;
}
【电能质量扰动】基于ML和DWT的电能质量扰动分类方法研究(Matlab实现)内容概要:本文研究了基于机器学习(ML)和离散小波变换(DWT)的电能质量扰动分类方法,并提供了Matlab实现代码。首先利用DWT对电能质量信号进行特征提取,有效捕捉电压暂降、暂升、中断、谐波、闪变等常见扰动的时频特性;随后结合多种机器学习分类器(如SVM、BP神经网络、随机森林等)对提取的特征进行训练与分类,构建高效的扰动识别模型。文中详细阐述了信号预处理、特征工程、模型训练与评估的全过程,验证了该方法在多类扰动识别中的准确性与鲁棒性。; 适合人群:具备一定信号处理和机器学习基础知识,从事电力系统、电气工程及相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于电能质量监测系统中对异常信号的自动识别与分类;②为智能电网中的故障诊断与电能质量管理提供技术支持;③作为Matlab仿真实践案例,帮助理解DWT在信号分析中的应用及ML分类器的实现流程。; 阅读建议:建议结合Matlab代码同步运行与调试,深入理解DWT分解过程及特征提取方法,同时可尝试更换不同分类器或优化参数以提升分类性能,进一步拓展至实际数据的应用验证。
基于分布式模型预测控制的多个固定翼无人机一致性控制(Matlab代码实现)内容概要:本文围绕“基于分布式模型预测控制的多个固定翼无人机一致性控制”展开,采用Matlab代码实现相关算法,属于顶级EI期刊的复现研究成果。文中重点研究了分布式模型预测控制(DMPC)在多无人机系统中的一致性控制问题,通过构建固定翼无人机的动力学模型,结合分布式协同控制策略,实现多无人机在复杂环境下的轨迹一致性和稳定协同飞行。研究涵盖了控制算法设计、系统建模、优化求解及仿真验证全过程,并提供了完整的Matlab代码支持,便于读者复现实验结果。; 适合人群:具备自动控制、无人机系统或优化算法基础,从事科研或工程应用的研究生、科研人员及自动化、航空航天领域的研发工程师;熟悉Matlab编程和基本控制理论者更佳; 使用场景及目标:①用于多无人机协同控制系统的算法研究与仿真验证;②支撑科研论文复现、毕业设计或项目开发;③掌握分布式模型预测控制在实际系统中的应用方法,提升对多智能体协同控制的理解与实践能力; 阅读建议:建议结合提供的Matlab代码逐模块分析,重点关注DMPC算法的构建流程、约束处理方式及一致性协议的设计逻辑,同时可拓展学习文中提及的路径规划、编队控制等相关技术,以深化对无人机集群控制的整体认知。

70,036

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧