2017-04-20 6 views
2

周波数ドメインの位相シフトを実装しようとしていますが、わからない点はほとんどありません。周波数ドメインの位相シフト、振幅、希望のサイズ、および非線形性

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 

答えて

0

100Hz未満の周波数は、FFTウィンドウで2サイクル未満です。 DFTまたはFFTは、非常に異なる周波数の正弦波の束全体を集計することによって、単一の非整数周期正弦波を含む任意の波形を表すことに留意されたい。例えばただ1つより多くのこと。それが、数学の仕組みです。

2サイクル未満のフォンハンウィンドウの場合、これらは多くの場合完全に異なる周波数の束です(低周波からのパーセンテージの点では非常に遠い場合があります)。周波数が完全に異なる周波数の位相をシフトすると、ウインドウ化された低周波正弦波を所望の量だけシフトすることができます(信号が整数周期とはどのように異なるかによって異なります)。

また、周波数が低い場合、完全な実際の結果を依然として表すために、複素共役ミラーを位相が逆の方向にシフトする必要があります。したがって、2つの重なり合った反対の位相変化を混合することになります。これは、低周波信号がDFTアパーチャ内の整数周期から遠く離れている場合は、主に問題になります。

時間とサンプルが長いウィンドウを使用すると、与えられた周波数のより多くのサイクルを内部に収めることができます(これにより、低周波成分を合成、周波数正弦波)。複素共役はFFT結果ビン指数の点から遠いので、干渉が減少する。

50%/(ある整数の)長さのvon Hannウィンドウの任意のホップを使用するシーケンスは、(最初​​のウィンドウまたは最後のウィンドウを除いて)非ロスではありません。他のすべてのホップサイズは情報を変調または破壊するため、再構成のために定数で正規化することはできません。

+0

ありがとうございました。 私のコードの以前のバージョンでは、逆方向に負の周波数をシフトしていましたが、位相の変更が適用されたときに振幅の変化が生じました。私はその後、現在のバージョンのコードに戻りました。 答えに低い周波数は何ですか? 逆の方向に負の低周波数だけシフトするのはなぜですか? – papaya

+0

配列が共役対称のままであるように位相を変更しないと、複雑な結果になります。それはあなたが欲しいものですか? – hotpaw2

+0

はい、ありがとうございます。それはうまく動作するようです。 – papaya

関連する問題