簡體   English   中英

在頻域中改變信號的相位

[英]Changing the phase of a signal in frequency domain

我想改變頻域中信號的相位。 所以我生成了一個余弦測試信號來驗證代碼:

ycheck = cos(2*pi*t);

當我想將相位移動到pi / 4時,我會對信號執行fft,將其分為幅度和相位,並從中減去pi / 4。

Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift

繪制結果,看起來只有信號的幅度降低,但沒有發生相移。 我在論壇上做了一些研究,發現這個帖子在頻域(MatLab)中改變信號的相位 所以我使用以下方法生成了另一個testignal:

y = exp(1i*2*pi*t);

當我用這個信號進行相移時,它會給出所需的結果。 遺憾的是我不能張貼圖片:(,所以我試着描述(代碼是附加的,所以你可以執行它):只有想象術語的ifft正確移動。標准余弦的ifft只降低幅度。我不明白,這里的問題是什么。

我的問題是,為什么相移對假想項中表示的信號起作用而不是對常規生成的余弦表示? 我的計划是將這種相移應用於實際信號 - 我可以將頻域中的相移應用於音樂信號,還是應用另一種(可能更智能)的方式?

我的代碼在這里:

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*angle(Ycheck)-1i*pi/4); % -pi/4 shift

為兩個指數添加相同的項(實際上,對所有頻率成分)。 那就是問題所在。

在普通傅里葉變換中,第一指數對應於變換域中的正頻率,第二指數對應於負頻率。 但是,由於您正在進行DFT(FFT),負頻率會折疊並出現在上半部分。 所以你需要在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM