周波数ドメインの位相シフトを実装しようとしていますが、わからない点はほとんどありません。周波数ドメインの位相シフト、振幅、希望のサイズ、および非線形性
1ホップサイズ50%のハニングウィンドウを使用して、正弦または掃引信号から完全な再構成を得ることができます。それにもかかわらず、ホップサイズ> 50%を使用すると、結果を正規化する方法はありますか?
2低周波信号の位相をシフトすると(f < 100、ウィンドウサイズ< 1024、fs = 44100)、私の結果にはある程度の非直線性がはっきりとわかります。これは、窓のサイズが低周波のために短くなるためですか?
ありがとうございました。
clear
freq=500;
fs=44100;
endTime=0.02;
t = 1/fs:1/fs:(endTime);
f1=linspace(freq,freq,fs*endTime);
x = sin(2*pi*f1.*t);
targetLength=numel(x);
L=1024;
w=hanning(L);
H=L*.50;% Hopsize of 50%
N=1024;
%match input length with window length
x=[zeros(L,1);x';zeros(L+mod(length(x),H),1)];
pend=length(x)- L ;
pin=0;
count=1;
X=zeros(N,1);
buffer0pad= zeros(N,1);
outBuffer0pad= zeros(L,1);
y=zeros(length(x),1);
delay=-.00001;
df = fs/N;
f= -fs/2:df:fs/2 - df;
while pin<pend
buffer = x(pin+1:pin+L).*w;
%append zero padding in the middle
buffer0pad(1:(L)/2)=buffer((L)/2+1: L);
buffer0pad(N-(L)/2+1:N)=buffer(1:(L)/2);
X = fft(buffer0pad,N);
% Phase modification
X = abs(X).*exp(1i*(angle(X))-(1i*2*pi*f'*delay));
outBuffer=real(ifft(X,N));
% undo zero padding----------------------
outBuffer0pad(1:L/2)=outBuffer(N-(L/2-1): N);
outBuffer0pad(L/2+1:L)=outBuffer(1:(L)/2);
%Overlap-add
y(pin+1:pin+L) = y(pin+1:pin+L) + outBuffer0pad;
pin=pin+H;
count=count+1;
end
%match output length with original input length
output=y(L+1:numel(y)-(L+mod(targetLength,H)));
figure(2)
plot(t,x(L+1:numel(x)-(L+mod(targetLength,H))))
hold on
plot(t,output)
hold off
ありがとうございました。 私のコードの以前のバージョンでは、逆方向に負の周波数をシフトしていましたが、位相の変更が適用されたときに振幅の変化が生じました。私はその後、現在のバージョンのコードに戻りました。 答えに低い周波数は何ですか? 逆の方向に負の低周波数だけシフトするのはなぜですか? – papaya
配列が共役対称のままであるように位相を変更しないと、複雑な結果になります。それはあなたが欲しいものですか? – hotpaw2
はい、ありがとうございます。それはうまく動作するようです。 – papaya