Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在频域中改变信号的相位_Matlab_Signal Processing_Complex Numbers_Dft - Fatal编程技术网

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很高兴我能帮忙:-)