频域相移,幅度,希望大小和非线性

时间:2017-04-20 16:46:03

标签: matlab signal-processing fft phase

我正在尝试实现频域相移,但我不确定的几点。

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

1 个答案:

答案 0 :(得分:0)

任何低于100 Hz的频率都会在FFT窗口中少于两个周期。注意,DFT或FFT表示任何波形,包括单个非整数周期正弦波,可能总结了一组频率非常不同的正弦曲线。例如不仅仅是一个。这就是数学运作的方式。

对于包含少于2个周期的von Hann窗口,这些通常是一堆大多数完全不同的频率(就低频率而言,可能距离很远)。移动所有那些完全不同的频率的相位可能会或可能不会使您的窗口低频正弦曲线移动所需的量(取决于您的信号与整数周期的频率差异)。

同样对于低频,复共轭镜需要在相位相反的方向上移位,以便仍然代表完全真实的结果。因此,如果低频信号远不是DFT孔径中的整数周期,那么最终会混合2个重叠和相反的相位变化,这也是一个问题。

使用更长的时间窗口和样本允许给定频率的更多周期适合其内部(因此可能需要较小功率的非常不同的频率正弦曲线求和,以便组成,组成或合成您的低频正弦波);并且复共轭在FFT结果bin索引方面更远,从而减少了干扰。

使用von Hann窗口的任何跃点的序列,其长度为50%/(某个整数)是无损的(除了第一个或最后一个窗口)。所有其他跳跃大小调制或破坏信息,因此不能通过常数进行归一化来重建。