咯咯 发表于 2012-12-9 10:57

已知频域值,如何用matlab的IFFT函数求时域图

在频域计算式中的得到一组1MHz:1MHz:1024MHz的频域数据,想将其转换到时域,我看论坛上的IFFT变换的步骤是:1先用对称性质构建负频率部分的值;2确定0Hz时的频域值;3最后对全频域(正频域+负频域)做IFFT变换。负频率部分值可以求,我想问的是 0Hz时的频域值怎么给定,IFFT后要不要乘以什么系数?求解答,谢谢!

fzwxjtu 发表于 2012-12-9 11:58

单是只有频域的幅值信息是重构不了时域信号的,还需要相位信息,否则反变换回去的解不是唯一的。
傅里叶变换本来就是复变换得到的是a+bi形式的含有相位信息的复数,这样才能完成逆变换,得到唯一的时域解。

咯咯 发表于 2012-12-9 17:13

fzwxjtu 发表于 2012-12-9 11:58 static/image/common/back.gif
单是只有频域的幅值信息是重构不了时域信号的,还需要相位信息,否则反变换回去的解不是唯一的。
傅里叶变 ...

我得到的这1024个数据是复数形式的啊,这应该算是有相位信息的吧?

happy 发表于 2012-12-11 10:18

咯咯 发表于 2012-12-9 17:13 static/image/common/back.gif
我得到的这1024个数据是复数形式的啊,这应该算是有相位信息的吧?

1. 0频率指的是信号的直流量
2. 你的1024复数结果是否是频域信息需要你自己判断
3. 频域信息直接ifft就可以重构数据,你可以找一组信号进行fft处理,然后再ifft就知道了

咯咯 发表于 2012-12-11 18:53

happy 发表于 2012-12-11 10:18 static/image/common/back.gif
1. 0频率指的是信号的直流量
2. 你的1024复数结果是否是频域信息需要你自己判断
3. 频域信息直接ifft就 ...

谢谢你的回答!1.我得到的频域值没有0Hz时的直流量,这个0Hz时的频域值在IFFT是否是必须的,如果是必须的,应该怎么填补;2我得到的这1024个复数结果是在频域里得到的,因此是频域信息的
请问 有没有对频谱响应做快速傅里叶逆变换得到时域结果的 例子或者资料?谢谢!

321forever 发表于 2012-12-11 20:44

fs=100;%设定采样频率
N=128;
n=0:N-1;
t=n/fs;
x=sin(2*pi*t);
figure(1);
subplot(311);
plot(t,x);
%进行FFT变换并做频谱图
y=fft(x,N)/N;%进行fft变换
mag=abs(y);%求幅值
f=(0:N-1)'*100/N;%进行对应的频率转换
subplot(312);
plot(f,mag);%做频谱图
%用IFFT恢复原始信号
xifft=ifft(y)*N;
magx=real(xifft);
subplot(313);
plot(t,magx);
从原函数经过fft再ifft,后还原

321forever 发表于 2012-12-11 20:45

咯咯 发表于 2012-12-11 18:53 static/image/common/back.gif
谢谢你的回答!1.我得到的频域值没有0Hz时的直流量,这个0Hz时的频域值在IFFT是否是必须的,如果是必须的 ...

lz是做滤波么,0hz上的直流分量是要被滤掉的啊

咯咯 发表于 2012-12-11 21:52

321forever 发表于 2012-12-11 20:45 static/image/common/back.gif
lz是做滤波么,0hz上的直流分量是要被滤掉的啊

谢谢!我不是在做滤波,在做导线间的串扰。我是按照这么做的,但是变换后的时域波形就是不对。我在频域计算得到的只有正频率部分的响应,我看论坛上说要反变换到时域还需知道负频率部分和0Hz部分的值,不能直接对正频域部分的复数列用IFFT啊。明天 我上传频域波形和按照你说的那种方法反变换出来的波形给你看下,感觉就是不对。谢谢!

321forever 发表于 2012-12-12 03:09

咯咯 发表于 2012-12-11 21:52 static/image/common/back.gif
谢谢!我不是在做滤波,在做导线间的串扰。我是按照这么做的,但是变换后的时域波形就是不对。我在频域计 ...

我倒是不理解负频率的概念, 不知道是不是就是与真是频率相对称的右半边呢,如果是的话,不能只取频率的左半边,例如,经过fft得到一个1*1000 的数列,不能只用1*500来做fft,要把右半边置0,就是只让左半边有数

happy 发表于 2012-12-12 09:54

321forever 发表于 2012-12-12 03:09 static/image/common/back.gif
我倒是不理解负频率的概念, 不知道是不是就是与真是频率相对称的右半边呢,如果是的话,不能只取频率的左 ...

负频率的出现纯是数学运算的结果,没有实际的物理意义
可以利用共轭对称的特性构造负频率信息

咯咯 发表于 2012-12-12 21:01

本帖最后由 咯咯 于 2012-12-12 21:05 编辑

321forever 发表于 2012-12-12 03:09 http://forum.chinavib.com/static/image/common/back.gif
我倒是不理解负频率的概念, 不知道是不是就是与真是频率相对称的右半边呢,如果是的话,不能只取频率的左 ...


你好!我先用matlab里的FFT来产生激励波形,然后将激励波形的频域值存到表里,供频域计算时调用,最后将计算得到的频域值,用IFFT反变换到时域。IFFT反变换的复数列是 其中负频率响应是根据对称性质对正频率值求得共轭。但是从反变换得到的图形上看,为什么刚开始激励波形为0时,反变换得到的会有响应呢?(反变换得到的时域波形刚开始并不为0)。我单纯用0作为激励源时,频域值都为0。不知道哪里错了,频域响应值应该不会错了,应该是反变换时出的错。我看了很多帖子,也没找到方法。谢谢!

咯咯 发表于 2012-12-12 21:02

happy 发表于 2012-12-12 09:54 static/image/common/back.gif
负频率的出现纯是数学运算的结果,没有实际的物理意义
可以利用共轭对称的特性构造负频率信息

你好!你能帮我看下吗?我这个反变换时怎么回事?谢谢!

321forever 发表于 2012-12-13 04:06

happy 发表于 2012-12-12 09:54 static/image/common/back.gif
负频率的出现纯是数学运算的结果,没有实际的物理意义
可以利用共轭对称的特性构造负频率信息

那负频率是fft后,图形中得到的与原频率(左半部)对称的右半部分么?

咯咯 发表于 2012-12-13 10:19

本帖最后由 咯咯 于 2012-12-13 10:22 编辑

321forever 发表于 2012-12-13 04:06 http://forum.chinavib.com/static/image/common/back.gif
那负频率是fft后,图形中得到的与原频率(左半部)对称的右半部分么?

第一幅图就是计算得到频域响应后经过ifft反变换到时域的波形,第二幅图是所加激励源的时域波形,第三幅图是激励源的频域波形。
这是激励波形的时域和频域的产生 N=4096; %%采样点数
Fs=4096000000; %%采样频率
k1=1;k2=1;
for t=0:1/Fs:1e-6;
if t<=1*1e-7
    %S_y1(k1)=1e6*10/5*t;
    S_y1(k1)=0;
    %S_y1(k1)=sin(2*pi*10000*t);
    k1=k1+1;
end
if t>1e-7&&t<=2.5*1e-7
    %S_y2(k2)=10-1e6/(2-0.5)*(t-5*1e-6);
    S_y2(k2)=1e7*1/(2.5-1)*(t-1e-7);
    k2=k2+1;
   % S_y2(k2)=sin(2*pi*10000*t);
end
if t>2.5*1e-7
    S_y2(k2)=1;
    k2=k2+1;
end
end
S_y=; %%%激励的时域波形

figure(6)
plot(0:1/Fs:1e-6,S_y);hold on;%%%画出时域波形
figure(7)
F_y=fft(S_y,N);%%对时域波形做FFT变换
A_F_y=abs(F_y)/(N/2);
A_F_y(1)=A_F_y(1)/2;
f=(-1)*Fs/N;
plot(f(1:N/2),A_F_y(1:N/2));%%%做出激励波形的频域图
%plot(f(1:N),A_F_y(1:N));
%plot(A_F_y);
%figure(4)
%I_F_y=1/N*conj((fft(conj(F_y))));
%plot((f.*1/Fs)*N/Fs,ifft(F_y));
%figure(5)
%plot((f.*1/Fs)*N/Fs,real(I_F_y));
for kk=1:1:(N/2)
    V_s(kk)=F_y(kk+1)/2;%%%将激励波形的频域值存到V_s中,供后面的频域计算时调用(1MHz:1Mhz:1024MHz的频域值)
end下面是对频域计算后得到的频域值进行IFFT变换
f_final=2048000000;%%%频率的最大值
f_initial=1000000; %%%初始计算的频率
fs=1000000; %%%采样频率
f=f_initial:fs:f_final
f_i(k_i)=log10(f);%%%对频率计数
f_P(k_i)=f;
w=2*pi*f;
=cable_R(f);%其中Z_r为铜芯的内阻抗矩阵,zp为屏蔽壳的内阻抗
Z_P=zp*ones(n-1);
Z_Z=Z_r+1i*w*L+Z_P;
Y_Y=1i*w*C;%%%忽略电导G

%%%%%%%%%%%%%%%%%%%%%%%%
%【5】对ZY矩阵的对角化及模态特性阻抗Zc
=eig(Z_Z*Y_Y);%求出来的Tv矩阵为特征向量组成的矩阵,其中第n列向量为C_v矩阵中第n个对角元的特征向量
r_v1=sqrt(C_v1);%%传播常数
=eig(Y_Y*Z_Z);
r_v2=sqrt(C_v2);%%传播常数
%模态特性阻抗Zc
Zc=(Z_Z*Ti/r_v2)/Ti;
%%%%%%%%%%%%%%%%%%%%%%%%%%
%【6】加激励源
Vs(1)=V_s(vs1);%%激励波形的频域值调用(1MHz:1MHz:1024MHz)
      vs1=vs1+1;%%%%%%%%%%%%%%%
%【7】利用边界求解方程组I+和I-
Q11=(Zc+Zs)*Ti;
Q12=(Zc-Zs)*Ti;
for k=1:1:n-1
    E_r_v2(k,k)=exp(r_v2(k,k)*LL);%%%正向传播
    E_r_v1(k,k)=exp((-1)*r_v2(k,k)*LL);%%负向传播
end
Q21=(Zc-ZL)*Ti*E_r_v1;
Q22=(Zc+ZL)*Ti*E_r_v2;
Q(1:(n-1),1:(n-1))=Q11;
Q(n:2*(n-1),n:2*(n-1))=Q22;
Q(1:(n-1),n:2*(n-1))=Q12;
Q(n:2*(n-1),1:(n-1))=Q21;
E_S(1:(n-1))=Vs;E_S(n:2*(n-1))=VL;%%激励源
%%求解Im+和Im-
Im=inv(Q)*E_S;
%%%【8】求解z=L处37芯的响应
for k=1:1:2*(n-1)
    if k<n
      Im_P(k)=Im(k);
    else
      Im_N(k-n+1)=Im(k);
    end
end
V_response=Zc*Ti*(E_r_v1*Im_P+E_r_v2*Im_N);

%%%【8.1】建立37芯的终端响应矩阵

for k=1:1:(n-1)
    V_res{k}(k_i)=V_response(k);
end
k_i=k_i+1;
end
figure(1)
plot(f_i,log10(abs(V_res{1})));hold on; %%计算得到的频域响应
grid on;
%%%【9.1】对上述铜芯的频域响应转换为时域响应
V_res1_real=real(V_res{1});%%1号铜芯的实部
V_res1_imag=imag(V_res{1});%%1号铜芯的虚部
V_res1_N=conj(V_res{1});%%1号铜芯的负频率部分
while k_i>1
    k_i=k_i-1;
    V_res1_NC(k_j)=V_res1_N(k_i);%%V_res1_NC为重排后的负频率部分
f_N(k_j)=-f_P(k_i);%%频率负的部分重排
    k_j=k_j+1;
   
end
U_res_1=;%%%用频域计算得到的频域响应值
t1=()*1/f_final;
figure(2)
plot(t1,real(ifft(U_res_1,2048)),'r');hold on;%%%频域值的IFFT反变换

hwdd2009 发表于 2014-7-9 11:01

学习!!!!!!
页: [1]
查看完整版本: 已知频域值,如何用matlab的IFFT函数求时域图