0

我正在尝试在 MATLAB 中创建真实信号,例如正弦波或正弦扫描。由于我想深入研究离散傅里叶变换的理论,我试图通过为我的频率响应和频域中的相关相位响应定义一个向量来创建这些信号,以使用在时域中检索相应的信号一个1000点ifft的MATLAB函数。问题是,我就是无法正确获得相位响应。

fa=16000;                             
n=1000;                             
t=(0:(n-1))/fa;                      
f=(0:(n-1))*fa/n;                    

%% sine
% frequency response
X=zeros(1,1000);                     
X(26)=1;                            
% Phase 
ANG=exp(-1i*pi/2);
X=X.*ANG
X=[X(1:501) conj(fliplr(X(2:500)))];       
figure;
plot(f,real(X));                          
x=ifft(X);                           

figure
stem(x);                       


%% Sweep
% amplitude
SWEEP_real=ones(1,1000);
%Phase
for n=1:1000
    ANG=exp(-1i*(pi/2)/(1000-n));
    n=n+1;
end
SWEEP=SWEEP_real*ANG;

sweep=ifft(SWEEP);

figure
stem(sweep)

对于正弦波,它以某种方式起作用,即使相位响应不正确。我知道这些相位响应应该是什么样子,但我无法重新创建它们。任何如何重新创建这些阶段响应的提示或建议将不胜感激。也许我没有正确地完成这项任务,我只是很困惑......

4

1 回答 1

1

好吧,您的代码中缺少一项基本操作。你会看到的:

1- 创建正弦波的傅立叶变换。 在此处输入图像描述

2- 将 ifft 转换为时域。

3- 使用 ifft,您现在得到了时域中的真实信号。您的代码中现在缺少的是将实时信号转换为分析信号。为此,您需要使用 hilbert() 在 Matlab 中执行的希尔伯特变换。

4- 使用获得的分析信号,您现在可以计算相位响应。在 Matlab 中,例如使用角度()。

看看我的代码:

fa = 16e3;                             
n = 1e3;                             
t = (0:(n-1))/fa;                      
f = (0:(n-1))*fa/n;   

%% create fourier transformed of a sine wave
X = zeros(1, 1000);                     
X(26) = 1;   
ANG = -1i/2;
X = X*ANG;
X = [X(1:501) conj(fliplr(X(2:500)))];

figure(); plot(f, real(X)); title('real(X)');
figure(); plot(f, imag(X)); title('imag(X)');

%% calculate the real signal in time domain with ifft
x_real = ifft(X);
figure(); plot(t, x_real); title('x real');

%% perform the hilbert transform on your real time signal to get the analytic signal
x_analytic = hilbert(x_real);

%% calculate the phase response
phaseresponse = angle(x_analytic);
figure(); plot(t, phaseresponse); title('phase response');

有关更多信息,您可以查看:

http://en.wikipedia.org/wiki/Analytic_signal

http://en.wikipedia.org/wiki/Hilbert_transform

此外,我想知道您在 for 循环中在做什么。变量 ANG 是一个标量,最终将包含循环中最后一次计算的结果。所以在你的情况下不需要循环。你知道我的意思?我不确定你基本上想在那里计算什么。

编辑:对于扫描/啁啾来说,它更难。我认为及时描述啁啾信号更容易:啁啾信号的时间公式

来源:维基百科

您可以通过计算“真正的”傅立叶变换将时间信号转换为频域,然后您可以尝试在 Matlab 中合成它。

根据维基百科,信号包含可以用贝塞尔函数描述的谐波:

在频域中,由方程 f(t)=f_{0}+kt 描述的瞬时频率伴随着作为频率调制的基本结果而存在的附加频率(谐波)。[需要引用]这些谐波被量化地描述通过使用贝塞尔函数。然而,借助频率与时间分布频谱图,我们可以很容易地看到线性啁啾在基本啁啾的谐波处具有频谱分量。

对我来说,这样做似乎很棘手。如果你想了解傅里叶变换之类的东西,我建议采用另一个(更简单的)信号或从时域接近啁啾信号。愿你及时创建一个啁啾,并将其转换为类似于我上面的计算到频域。祝你好运

于 2014-02-07T13:45:31.067 回答