【问题标题】:Creating real signals out of a frequency response and associated phase response从频率响应和相关的相位响应中创建真实信号
【发布时间】:2014-02-07 11:40:41
【问题描述】:

我正在尝试在 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)

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

【问题讨论】:

    标签: matlab fft ifft


    【解决方案1】:

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

    1- 创建正弦波的傅立叶变换。

    2- 使用 ifft 将其转换为时域。

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

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

    看看我的代码:

    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 是一个标量,最终将包含循环中最后一次计算的结果。所以在你的情况下不需要循环。你知道我的意思?我不确定你基本上想在那里计算什么。

    编辑:对于扫频/啁啾来说,难度更大。我认为及时描述一个啁啾信号更容易:

    (source: wikipedia)

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

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

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

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

    【讨论】:

    • 任何想法如何实现这一点?我就是做不好。不过还是谢谢你
    • 我认为挑战在于创建“时间啁啾”信号的复杂频谱。其余的应该是一样的。因此,您必须考虑频谱的外观。我在上面的编辑中添加了一些基本信息...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多