我正在尝试在MATLAB中创建真正的信号,如正弦波或正弦波扫描。由于我想深入研究离散傅里叶变换的理论,我试图通过为频率响应定义一个矢量以及在频域中相关的相位响应来创建这些信号,以便在时域中检索相应的信号。 MATLAB的1000点ifft
函数。问题是,我无法得到正确的阶段响应。
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)
对于正弦波,即使相位响应不正确,它也能以某种方式工作。我知道这些阶段响应应该是什么样子,但我无法重新创建它们。任何提示或建议如何重新创建这些阶段响应将不胜感激。也许我没有接近这个任务,我只是很困惑......
答案 0 :(得分: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是一个标量,最后将包含循环中最后一次计算的结果。所以在你的情况下不需要循环。你知道我的意思?我不确定你在那里计算的是什么。
编辑:对于扫描/啁啾,它更难。我认为更容易及时描述啁啾信号:
您可以通过计算'真'傅立叶变换将时间信号转换为频域,然后您可以尝试在Matlab中合成它。
根据维基百科,信号中包含可由贝塞尔函数描述的谐波:
在频域中,由等式f(t)= f_ {0} + kt描述的瞬时频率伴随着作为频率调制的基本结果而存在的附加频率(谐波)。[引证需要]这些谐波通过使用贝塞尔函数可量化地描述。然而,借助于频率与时间曲线频谱图,可以很容易地看出线性啁啾在基波啁啾的谐波处具有频谱分量。
对我而言,这样做似乎相当棘手。如果对你来说理解像傅里叶变换这样的东西我建议采用另一个(更简单的)信号或接近来自时域的啁啾信号。你可以及时创建一个啁啾,并将其转换为类似于我上面的计算到频域。祝你好运