首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB:用ifft提取原始信号

MATLAB:用ifft提取原始信号
EN

Stack Overflow用户
提问于 2016-04-14 10:57:29
回答 2查看 1.2K关注 0票数 0

我有一个时变信号(基频和一些谐波),我计算了fft(),然后除以一个频率相关的灵敏度,M(f)。然后,我希望使用ifft()将其转换回时间域,以获取时变信号,但ifft()似乎不起作用,即:

代码语言:javascript
复制
p(t) = ifft(fft(v(t)./M(f))

ifft()不是在做我想做的事吗?

*跟进*

为了理解这一点,我编写了以下代码:

代码语言:javascript
复制
% v(t)

t=0:0.1:10;
a=sin(t);

subplot(1,5,1); plot(t,a); 
title('1. time domain'); 
xlabel('t [s]')
ylabel('p.d. [v]')
hold on;

% fft(v(t))

T = t(2);                       % Sampling period
Fs=1/T;
L = length(t);                  % Length of signal
Y = fft(a);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;

subplot(1,5,2); plot(f,P1);
title('2. frequency domain (fft(vt))')
xlabel('f [Hz]')
ylabel('magnitude')

%frequency responce (sensitivity), M(f)

resp=ones(1,length(f)); %1=1

subplot(1,5,3); plot(f,resp);
title('3. Simulated sensitivity (M(f))')
xlabel('f [Hz]')
ylabel('v / p')

% fft(v(t))./M(f)

fftResp=P1./resp;

subplot(1,5,4); plot(f,fftResp);
title('4. fft(v(t))./M(f)')
xlabel('f [Hz]')
ylabel('fft(v(t)) / M(f)')

%Inverse fft, p(t) = ifft(fft(v(t)./M(f)))

pt = real(ifft(fftResp));

subplot(1,5,5); plot(pt);
title('5. time domain (ifft)')
xlabel('t [s]')
ylabel('p.d. [p]')

结果:https://www.dropbox.com/s/18tqeyqey2pc5te/SOfigure.png?dl=0

在所有频率下,M(f) =1,我期望得到最终的ifft()结果(图)。5)等于初始时域信号(图5)。( 1)但事实并非如此?第二FFT (图2)。3)相当于第一(图3)。2)哪个是正确的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-14 15:09:37

您的错误源于您对absreal的理解,它们是不一样的。在这一行中可以找到错误:

代码语言:javascript
复制
P2 = abs(Y/L);

这里,Y是复杂的fft结果,L是标量,您需要使用real而不是abs

代码语言:javascript
复制
P2 = real(Y/L);

这一结果是:

票数 1
EN

Stack Overflow用户

发布于 2016-04-14 12:19:17

也许你应该用./接线员。它将每一个对应的项目划分为向量:

代码语言:javascript
复制
p(t) = ifft(fft(v(t)./M(f)))

应该行得通。有时ifft计算以小虚部为输出的复信号。也可以试试这个:

代码语言:javascript
复制
p(t) = real(ifft(fft(v(t)./M(f))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36621040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档