白天想了下傅里叶变换的性质,时域平移对应的频域效果我想成了频移,但又总觉得不太对,就仿真了一下,想获得信号时移前后的相位值。一仿真,又出现了其他问题,主要是
- 信号的相位谱非常乱,每个频率都有一个初始相位值
- 是否是整周期采样
混乱的相位谱如下所示,
后来查看变量的值发现,FFT之后的实部值与虚部值有很多非常小的值(应该是由于计算机的量化误差导致),造成了相位值的混乱。
于是将幅值较小的信号值直接赋0,相位谱就干净了许多,
对信号进行延迟,延迟量为d,其对应的相移与频率、采样率相关(
2
p
i
∗
f
∗
d
∗
t
s
2pi \ast f \ast d \ast ts
2pi∗f∗d∗ts);FFT运算之后,获得单点频信号的索引号,查询对应位置处的相位值,可以发现延迟前与延迟后的相移量与理论值相同。
%==========================================================================
% 清空一切
clc;clear all;close all;
%==========================================================================
% 生成信号
FS = 1024;
N = 1024;
f = 100; %为了便于观测结果,整周期采样
d = 3;
t1 = (0:N-1)/FS;
s1 = cos(2*pi*f*t1);
t2 = ((0:N-1)-d)/FS;
s2 = cos(2*pi*f*t2);
y1 = fft(s1);
y2 = fft(s2);
pse1 = angle(y1)/pi*180;
pse2 = angle(y2)/pi*180;
k = floor(f/FS*N);
%==========================================================================
% 计算时域位移对应的相移
delta_phi = 2*pi*f*d/FS/pi*180
%==========================================================================
TH = 1e-10;
y3 = y1;
index = find(abs(y3)<TH);
y3(index) = 0;
pse3 = angle(y3)/pi*180;
y4 = y2;
index = find(abs(y4)<TH);
y4(index) = 0;
pse4 = angle(y4)/pi*180;
%==========================================================================
% 画图
figure;
hold on;
plot(s1,'r*-');
plot(s2,'bo-');
hold off;
title('时域');
figure;
hold on;
plot(20*log10(abs(y1)),'r*-');
plot(20*log10(abs(y2)),'bo-');
hold off;
title('频域');
figure;
hold on;
plot(pse1,'r*-');
plot(pse2,'bo-');
hold off;
title('相位');
figure;
hold on;
plot(pse3,'r*-');
plot(pse4,'bo-');
hold off;
title('去除较小值后的相位');