声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2862|回复: 4

[编程技巧] 傅立叶反变换后的结果不一样

[复制链接]
发表于 2012-2-19 01:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

一个三角波电压输入一个二阶振荡系统后的位移响应如图1所示,但对位移进行傅立叶反变换反过来验证其输入电压时,得到的却不是三角波的电压如图2。请问怎么会产生这种情况呢?输入电压的数据见附件voltage.txt
voltage.txt (1.11 KB, 下载次数: 1)
QQ截图20120219015959.jpg
图1
QQ截图20120219020041.jpg
图2
求位移响应的程序:
%初始条件
n=100;%数据点数
f=20000;%电压频率[Hz]
zp=0.18;%二阶系统阻尼系数
wn=283000;%二阶系统固有圆频率[rad/s]
df=0:f:(n-1)*f;%二阶系统传递函数用

%电压输入
fp = fopen('voltage.txt');
x = fscanf(fp,'%f',[1 n]);
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;%电压频率[Hz]
zp=0.18;%二阶系统阻尼系数
wn=283000;%二阶系统固有圆频率[rad/s]
df=0:f:(n-1)*f;%二阶系统传递函数用

%位移输出
fp=fopen('displacement.txt');%读取文件数据
y=fscanf(fp,'%f',[1 n]);
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');  


回复
分享到:

使用道具 举报

发表于 2012-2-20 17:25 | 显示全部楼层
回复 1 # yuxinpeng 的帖子

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

  2. 02.N=128;

  3. 03.n=0:N-1;

  4. 04.t=n/fs;

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

  6. 06.%生成正弦信号

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

  8. 08.figure(1);

  9. 09.subplot(311);

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

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

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

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

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

  15. 15.subplot(312);

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

  17. 17.%用IFFT恢复原始信号

  18. 18.xifft=ifft(y)*N;

  19. 19.magx=real(xifft);

  20. 20.subplot(313);

  21. 21.plot(t,magx);
复制代码
 楼主| 发表于 2012-2-20 19:01 | 显示全部楼层
本帖最后由 yuxinpeng 于 2012-2-20 19:09 编辑

回复 2 # 321forever 的帖子

可惜这个是单一信号,中间没有信号的运算,感觉可能是两个信号乘除时出了问题。
因为曾经对输入、传递函数各自进行ifft,都能还原原来的波形。
但经过运算后,点乘之后再进行点除,却还原不了输入波形。感到很困惑!
 楼主| 发表于 2012-2-21 09:56 | 显示全部楼层
本帖最后由 yuxinpeng 于 2012-2-21 09:59 编辑

个人在,“求位移响应的程序”及“反求系统输入电压的程序”后面都加了一段程序验证输出位移波形的幅频特性:
前一个程序的幅频特性是:
1.jpg
后一个程序的幅频特性是:
2.jpg
所以,现在的问题应该出在位移信号的幅频不对应。
请问, 为什么同一个波形,得出的幅频特性不一样呢?

发表于 2012-6-30 09:18 | 显示全部楼层
这篇帖子看完,频域积分搞定
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-14 05:44 , Processed in 0.115421 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表