好吧 上代码……………………
头文件:
#ifndef MYWINDOW_H
#define MYWINDOW_H
#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QPainter>
#include <QSpinBox>
#include <math.h>
#define N 128
#define PI 3.1215926
class mywindow:public QWidget
{
Q_OBJECT
public:
mywindow();
void FFT(double x[],double y[],int n,int sign); //傅里叶变换函数,测试过的,没问题
void inital(double *m_x,double *m_y); //初始化我傅里叶变换的序列
private:
int frequence1,frequence2; //这两个变量是我要在QSpinBox里面获得的数值
double X[N];
double Y[N];
QPainter *paint2;
QPushButton * button;
QSpinBox *w2,*w1;
void paintEvent(QPaintEvent *); //我所有的绘图都是在这里面
public slots:
void test(); //自己定义的槽,当我单击按钮时 frequence1,frequence2
//获得QSpinBox里面的数值,并重绘整个界面
};
#endif // MYWINDOW_H
CPP文件:
#include "mywindow.h"
mywindow::mywindow()
{
this ->setGeometry(300,30,600,650);
button = new QPushButton("OK",this);
button ->setGeometry(500,500,50,20);
connect(button,SIGNAL(clicked()),this,SLOT(test()));
w1 = new QSpinBox(this);
w1 ->setRange(0,100);
w1 ->setGeometry(500,400,50,20);
w2 = new QSpinBox(this);
w2 ->setRange(0,100);
w2 ->setGeometry(500,450,50,20);
paint2 = new QPainter;
frequence2 = 1;
frequence1 = 1;
}
void mywindow::FFT(double x[], double y[], int n, int sign)
{
int i,j,k,l,m,n1,n2;
double c,c1,e,s,s1,t,tr,ti;
for(j = 1,i = 1; i<16; i++)
{
m = i;
j = 2*j;
if(j == n)
break;
}
//计算蝶形图的输入下标(码位倒读)
n1 = n - 1;
for(j=0,i=0; i<n1; i++)
{
if(i<j)
{
tr = x[j];
ti = y[j];
x[j] = x;
y[j] = y;
x = tr;
y = ti;
}
k = n/2;
while(k<(j+1))
{
j = j - k;
k = k/2;
}
j = j + k;
}
//计算每一级的输出,l为某一级,i为同一级的不同群,使用同一内存(即位运算)
n1 = 1;
for(l=1; l<=m; l++)
{
n1 = 2*n1;
n2 = n1/2;
e = 3.1415926/n2;
c = 1.0;
s = 0.0;
c1 = cos(e);
s1 = -sign*sin(e);
for(j=0; j<n2; j++)
{
for(i=j; i<n; i+=n1)
{
k = i + n2;
tr = c*x[k] - s*y[k];
ti = c*y[k] + s*x[k];
x[k] = x - tr;
y[k] = y - ti;
x = x + tr;
y = y + ti;
}
t = c;
c = c*c1 - s*s1;
s = t*s1 + s*c1;
}
}
//如果是求IFFT,再除以N
if(sign == -1)
{
for(i=0; i<n; i++)
{
x /= n;
y /= n;
}
}
}
void mywindow::inital(double *m_x,double *m_y)
{
int i;
for(i = 0; i < N; i++)
{
X = m_x;
Y = m_y;
}
}
void mywindow::paintEvent(QPaintEvent *)
{
paint2 ->begin(this);
paint2 ->setPen(QPen(Qt::black,2,Qt::SolidLine));
int i;
double temp = 0,j = 0;
for(i = 0; i < N; i ++)
{
// temp = sqrt(X*X+Y*Y);
paint2 ->drawLine(j,250,j ,250 - 40*X);
j +=3;
}
FFT(X,Y,N,1);
j = 0;
for(i = 0; i < N; i ++)
{
temp = sqrt(X*X+Y*Y);
paint2 ->drawLine(j,600,j ,600 - 1.5*temp);
j +=3;
}
paint2 ->end();
}
void mywindow::test()
{
int j;
double m = 0;
double x[N] = {0};
double y[N] = {0};
for(j = 0; j < N; j++)
{
x[j] = 1*sin(frequence2*m)+1*sin(frequence1*m);
m += 0.25;
}
frequence1 = w1 ->value();
frequence1 = w2 ->value();
inital(x,y);
repaint();
}
代码有点长,但这个问题实在不知道怎么解决了……崩溃啦