傅立叶反变换后的结果不一样
本帖最后由 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');
回复 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:09 编辑
回复 2 # 321forever 的帖子
可惜这个是单一信号,中间没有信号的运算,感觉可能是两个信号乘除时出了问题。
因为曾经对输入、传递函数各自进行ifft,都能还原原来的波形。
但经过运算后,点乘之后再进行点除,却还原不了输入波形。感到很困惑!
本帖最后由 yuxinpeng 于 2012-2-21 09:59 编辑
个人在,“求位移响应的程序”及“反求系统输入电压的程序”后面都加了一段程序验证输出位移波形的幅频特性:
前一个程序的幅频特性是:
后一个程序的幅频特性是:
所以,现在的问题应该出在位移信号的幅频不对应。
请问, 为什么同一个波形,得出的幅频特性不一样呢?
这篇帖子看完,频域积分搞定
页:
[1]