yuxinpeng 发表于 2012-2-19 01:17

傅立叶反变换后的结果不一样

本帖最后由 yuxinpeng 于 2012-2-19 01:24 编辑

一个三角波电压输入一个二阶振荡系统后的位移响应如图1所示,但对位移进行傅立叶反变换反过来验证其输入电压时,得到的却不是三角波的电压如图2。请问怎么会产生这种情况呢?输入电压的数据见附件voltage.txt


图1

图2
求位移响应的程序:
%初始条件
n=100;%数据点数
f=20000;%电压频率
zp=0.18;%二阶系统阻尼系数
wn=283000;%二阶系统固有圆频率
df=0:f:(n-1)*f;%二阶系统传递函数用

%电压输入
fp = fopen('voltage.txt');
x = fscanf(fp,'%f',);
fclose(fp);
X=fft(x,n);%n点fft
Xg=abs(X)/sum(x);%幅值
Xp=angle(X)*180/pi;%相位

%二阶传递函数
E=ones(1,n);
A=wn^2*E;%分子
B=wn^2-4*pi^2*df.*df;%分母实部
C=j*4*pi*zp*wn*df;%分母虚部
G=A./(B+C);%传递函数
Gg=abs(G);%幅值
Gp=angle(G)*180/pi;%相位

%求位移输出
Yg=Xg.*Gg;%幅值
Yp=Xp+Gp;%相位
Y=sum(x)*Yg.*(cos(Yp*pi/180)+i*sin(Yp*pi/180));
y=ifft(Y);%逆fft
fp2= fopen('displacement.txt','wt');%将数据输出到文件
fprintf(fp2,'%f\n',y);
fclose(fp2);

%绘图
dt=(0:n-1)/f/n;%采样周期
subplot(1,2,1);
plot(dt,x,'r');
title('v(t)')
xlabel('Time s');   
ylabel('Applied voltage V');
subplot(1,2,2);
plot(dt,y,'r');
title('x(t)')
xlabel('Time s');   
ylabel('Displacement um');

反求系统输入电压的程序:
%初始条件
n=100;%数据点数
f=20000;%电压频率
zp=0.18;%二阶系统阻尼系数
wn=283000;%二阶系统固有圆频率
df=0:f:(n-1)*f;%二阶系统传递函数用

%位移输出
fp=fopen('displacement.txt');%读取文件数据
y=fscanf(fp,'%f',);
fclose(fp);
Y=fft(y,n);%n点fft
Yg=abs(Y)/sum(y);%幅值
Yp=angle(Y)*180/pi;%相位

%二阶传递函数
E=ones(1,n);
A=wn^2*E;%分子
B=wn^2-4*pi^2*df.*df;%分母实部
C=j*4*pi*zp*wn*df;%分母虚部
G=A./(B+C);%传递函数
Gg=abs(G);%幅值
Gp=angle(G)*180/pi;%相位

%ifft反求电压输入
Xg=Yg./Gg;%幅值
Xp=Yp-Gp;%相位
X=sum(x)*Xg.*(cos(Xp*pi/180)+i*sin(Xp*pi/180));%逆fft
x=ifft(X);
fp3= fopen('ifftvoltage.txt','wt');%将数据输出到文件
fprintf(fp3,'%f\n',y);
fclose(fp3);

%绘图
dt=(0:n-1)/f/n;
subplot(1,2,1);
plot(dt,y,'r');
title('v(t)')
xlabel('Time s');   
ylabel('Applied voltage V');
subplot(1,2,2);
plot(dt,x,'r');
title('x(t)')
xlabel('Time s');   
ylabel('Displacement um');


321forever 发表于 2012-2-20 17:25

回复 1 # yuxinpeng 的帖子

这里有个从sin做fft后再做ifft的例子,希望能对lz有帮助01.fs=100;%设定采样频率

02.N=128;

03.n=0:N-1;

04.t=n/fs;

05.f0=10;%设定正弦信号频率

06.%生成正弦信号

07.x=sin(2*pi*f0*t);

08.figure(1);

09.subplot(311);

10.plot(t,x);%作正弦信号的时域波形

11.%进行FFT变换并做频谱图

12.y=fft(x,N)/N;%进行fft变换

13.mag=abs(y);%求幅值

14.f=(0:N-1)'*100/N;%进行对应的频率转换

15.subplot(312);

16.plot(f,mag);%做频谱图

17.%用IFFT恢复原始信号

18.xifft=ifft(y)*N;

19.magx=real(xifft);

20.subplot(313);

21.plot(t,magx);

yuxinpeng 发表于 2012-2-20 19:01

本帖最后由 yuxinpeng 于 2012-2-20 19:09 编辑

回复 2 # 321forever 的帖子

可惜这个是单一信号,中间没有信号的运算,感觉可能是两个信号乘除时出了问题。
因为曾经对输入、传递函数各自进行ifft,都能还原原来的波形。
但经过运算后,点乘之后再进行点除,却还原不了输入波形。感到很困惑!

yuxinpeng 发表于 2012-2-21 09:56

本帖最后由 yuxinpeng 于 2012-2-21 09:59 编辑

个人在,“求位移响应的程序”及“反求系统输入电压的程序”后面都加了一段程序验证输出位移波形的幅频特性:
前一个程序的幅频特性是:

后一个程序的幅频特性是:

所以,现在的问题应该出在位移信号的幅频不对应。
请问, 为什么同一个波形,得出的幅频特性不一样呢?

hitalfa 发表于 2012-6-30 09:18

这篇帖子看完,频域积分搞定
页: [1]
查看完整版本: 傅立叶反变换后的结果不一样