Matlab 频域相移、振幅、尺寸和非线性

Matlab 频域相移、振幅、尺寸和非线性,matlab,signal-processing,fft,phase,Matlab,Signal Processing,Fft,Phase,我试图实现频域相移,但有几点我不确定 1-我能够使用跳跃大小为50%的汉宁窗口从正弦或扫描信号获得完美重建。然而,当使用跃点大小>50%时,我应该如何使结果正常化 2-低频信号移相时(f任何低于100 Hz的频率在FFT窗口中都少于两个周期。请注意,DFT或FFT表示任何波形,包括一个非整数周期正弦波,方法可能是将一组频率非常不同的正弦波相加。例如,远不止一个。这正是数学的工作原理 对于包含少于2个周期的von Hann窗,这些频率通常是一组完全不同的频率(可能与低频的百分比相差很远)。移动所有

我试图实现频域相移,但有几点我不确定

1-我能够使用跳跃大小为50%的汉宁窗口从正弦或扫描信号获得完美重建。然而,当使用跃点大小>50%时,我应该如何使结果正常化


2-低频信号移相时(f任何低于100 Hz的频率在FFT窗口中都少于两个周期。请注意,DFT或FFT表示任何波形,包括一个非整数周期正弦波,方法可能是将一组频率非常不同的正弦波相加。例如,远不止一个。这正是数学的工作原理

对于包含少于2个周期的von Hann窗,这些频率通常是一组完全不同的频率(可能与低频的百分比相差很远)。移动所有这些完全不同频率的相位可能会或可能不会将加窗低频正弦波移动所需的量(取决于您的信号与整数周期信号的频率差异)

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

使用更长的时间和采样窗口,可以使给定频率的更多周期适应它(因此可能需要对非常不同的频率正弦曲线进行较小的幂次求和,以便合成、合成或合成低频正弦曲线)复数共轭在FFT结果面元索引方面距离更远,从而减少了干扰


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

非常感谢您的回答。在我以前的代码版本中,我将负频率移向相反的方向,但在应用相位修改时,它会产生振幅变化。然后我转到b返回到当前版本的代码。您能在您的答案中指定什么是低频吗?为什么我们只能将负低频移到相反的方向?如果您不修改相位以使阵列保持共轭对称,您将得到一个复杂的结果。这是您想要的吗?
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