0

だから私は単純なサイン関数 pi/2 をシフトしたい単純なプログラムを持っています。これは、バイアス (つまり、A*sin(2*pi*周波数 + バイアス)) を挿入するだけで非常に簡単であることがわかりました。しかし、このプログラムは、理論をテストするための簡単な方法です。複雑な磁気データをシフトする必要がありますが、シフトは周波数に依存します. その方法を理解するために, この正弦波を設定されたシフトだけシフトしたいのですが, 周波数領域でそれを行いたい. 以下のコードはエラーを示していませんが, エラーはあります.データを適切にシフトしないと、マグニチュードに影響します. コードは以下の通りです. ありがとう!

clear all
time = 1:0.01:2*pi; %Create time vector
mag = sin(2*pi*time);
Y = fft(mag); %transform
Pnewr = pi/2;
%t = angle(mag);
t = imag(Y);
%t_fin = t-Pnewr; %Subtract the pahse delay from the original phase vector
R=real(Y);
I=t;
k = I./R
Phi = tan(k);
PhiFinal = Phi-Pnewr;
PhiFinal = PhiFinal'
IFinal = R * atan(PhiFinal);
spec=complex(R,IFinal);
Finalspec = ifft(spec); %Invert the transform
Final = Finalspec;
plot(time,mag);
hold on
plot(time,Final,'r')
grid on
4

1 に答える 1

0

1 つには、虚数成分と実数成分を適切に再結合していないため、

PhiFinal = PhiFinal'
IFinal = R * atan(PhiFinal);

要素ごとの積ではなく、実質的に内積です。一般に、複雑な関係を正しく利用しているようには見えません。以下は、きれいな位相シフトを生成します。

time = 1:0.01:2*pi; 
mag = sin(2*pi*time);
Y = fft(mag); %transform

Pnewr = pi/2;

R = real(Y);
I = imag(Y);

It = abs(Y);
% It = sqrt(I.^2 + R.^2);

Phi= angle(Y); % <-- using matlab function, equivalent to `Phi = atan2(I, R);`

k = I./R;
Phi0 = atan(k);

figure, subplot(121), plot(Phi0,Phi,'.'), xlabel('Phi from tan'), ylabel('Phi from ''angle'''), grid on, axis('tight')

PhiFinal = Phi-Pnewr; % <-- phase shift

IFinal = It .* sin(PhiFinal);
RFinal = It .* cos(PhiFinal);
spec= RFinal + 1i*IFinal;
Final = ifft(spec); %Invert the transform

subplot(122)
plot(time,mag);
hold on
plot(time,real(Final),'r')
plot(time,imag(Final),'r:')
grid on
axis('tight')
legend('Initial','Final'),xlabel('t'), ylabel('I')

mag*mag'   % <-- check that total power is conserved
Final*Final'

tanこれらの図は、 vs matlab angle( を使用) で計算された位相atan2と、位相シフトの結果 (右側のパネル) を示しています。

ここに画像の説明を入力

于 2013-08-14T09:59:25.553 に答える