Matlab 在频域中改变信号的相位
我想在频域中改变信号的相位。所以我生成了一个余弦测试信号来验证代码:Matlab 在频域中改变信号的相位,matlab,signal-processing,complex-numbers,dft,Matlab,Signal Processing,Complex Numbers,Dft,我想在频域中改变信号的相位。所以我生成了一个余弦测试信号来验证代码: ycheck = cos(2*pi*t); 当我想将相位移到pi/4左右时,我对信号进行fft,将其在幅度和相位上分开,并从中减去pi/4 Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift 绘制结果时,看起来只有信号的振幅降低了,但没有发生相移。我在论坛上做了一些研究,发现了这篇文章。因此,我使用以下方法生成了另一个testsignal:
ycheck = cos(2*pi*t);
当我想将相位移到pi/4左右时,我对信号进行fft,将其在幅度和相位上分开,并从中减去pi/4
Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift
绘制结果时,看起来只有信号的振幅降低了,但没有发生相移。我在论坛上做了一些研究,发现了这篇文章。因此,我使用以下方法生成了另一个testsignal:
y = exp(1i*2*pi*t);
当我用这个信号做相移时,它给出了期望的结果。可悲的是,我不能发布图片:(,所以我试着描述(代码是附加的,所以你可以执行它):只有imaginery项的ifft被正确移动。标准余弦的ifft只是振幅降低。我不太明白,这里有什么问题
我的问题是,为什么相移作用于以虚项表示的信号,而不是以规则生成的余弦表示的信号?我的计划是将此相移应用于真实信号-我可以将频域中的相移应用于eg音乐信号,还是有其他(可能更聪明的)方法
我的代码在这里:
clear all;
close all;
clc;
N = 64; %number of samples
fs = 10; %sampling frequency
ts = 1/fs; %sample interval
tmax = (N-1)*ts;
t = 0:ts:tmax;
y = exp(1i*2*pi*t);
ycheck = cos(2*pi*t);
% plot test signals
figure
plot(t,y)
hold on
plot(t,ycheck,'r--')
% fft
Y = fft(y);
Ycheck = fft(ycheck);
% phase shift
Y = abs(Y).*exp(1i*angle(Y)-1i*pi/4); % -pi/4 shift
Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift
%ifft
u = ifft(Y);
ucheck = ifft(Ycheck);
% plot
figure
plot(t,real(u),'k')
hold on
plot(t,real(y),'r')
hold on
plot(t,real(ucheck),'g')
hold on
plot(t,ycheck,'b--')
legend('ifft(exp(1i*2*pi*t)) %-pi/4shift','real(cos(2*pi*t))','ifft(cos(2*pi*t)) %-pi/4 shift','cos(2*pi*t)')
有趣的问题
如您所知,余弦可以表示为两个假想指数之和:
cos(x) = ( exp(1i*x) + exp(-1i*x) ) / 2;
更改余弦的相位意味着在余弦参数x
中添加一个数字,例如phi
:
cos(x+phi) = ( exp(1i*(x+phi)) + exp(-1i*(x+phi)) ) / 2;
就是
cos(x+phi) = ( exp(1i*x + 1i*phi) + exp(-1i*x - 1i*phi) ) / 2;
因此,您需要在其中一个指数中添加1i*phi
,在另一个指数中减去1i*phi
。在您的情况下,phi=-pi/4
Ycheck=abs(Ycheck)。*exp(1i*角度(Ycheck)-1i*pi/4);%-pi/4移位
将相同的项添加到两个指数(实际上,添加到所有频率分量)。这就是问题所在
在普通的傅里叶变换中,第一个指数对应于变换域中的正频率,第二个指数对应于负频率,负频率折叠并出现在上半部分。因此,需要在DFT的下半部分添加phi
,在上半部分减去phi
假设DFT的点数为偶数,如您的示例中所示,只需将上面所示的线替换为
phi = -pi//4; %/ desired phase shift
ind = 1:numel(Ycheck)/2; %// lower half
Ycheck(ind) = abs(Ycheck(ind)).*exp(1i*angle(Ycheck(ind))+1i*phi); %// add 1i*phi
ind = numel(Ycheck)/2+1:numel(Ycheck); %// upper half
Ycheck(ind) = abs(Ycheck(ind)).*exp(1i*angle(Ycheck(ind))-1i*phi); %// subtract 1i*phi
哇,谢谢你的回答,现在我明白了!我只想到了将复数描述为“absexp(iangle)”的公式完全忘记了dft的基本事实。谢谢你让我意识到了偶数点的问题。所以万一我需要零填充。我也不会想到这个。:@burgo很高兴我能帮忙:-)