频域相移、振幅、希望大小和非线性
Frequency domain phase shift, amplitude, hope size and non-linearity
我正在尝试实现频域相移,但有几点我不确定。
1- 我能够使用跳跃大小为 50% 的汉宁 window 从正弦或扫描信号中获得完美的重建。然而,当使用跃点大小 > 50% 时,我应该如何标准化我的结果?
2- 移动低频信号的相位时(f<100,window size<1024,fs=44100)我可以清楚地看到结果中存在一些非线性。这是因为 window 尺寸对低频来说太短了吗?
非常感谢您的帮助。
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
任何低于 100 Hz 的频率在您的 FFT 中都少于两个周期 window。请注意,DFT 或 FFT 表示任何波形,包括单个非整数周期正弦波,可能是对一整串频率非常不同的正弦波求和。例如不止一个。这就是数学的原理。
对于包含少于 2 个周期的 von Hann window,这些通常是一堆几乎完全不同的频率(可能与低频的百分比相差甚远)。移动所有这些完全不同频率的相位可能会或可能不会将您的 windowed 低频正弦波移动所需的量(取决于您的信号与整数周期信号的频率有多大不同)。
同样对于低频,复共轭反射镜需要在相位的相反方向上移动,以便仍然代表完全真实的结果。所以你最终混合了 2 个重叠和相反的相位变化,如果低频信号在 DFT 孔径中远非整数周期,这又是一个主要问题。
在时间和样本中使用更长的 window 允许给定频率的更多周期适合它(因此可能需要将非常不同频率的正弦波的较小功率相加以组成,使向上或合成你的低频正弦波);并且复共轭在FFT结果bin索引方面更远,从而减少干扰。
使用 von Hann window 的任何跳跃的序列,长度为 50% /(某个整数)是无损的(除了第一个或最后一个 window)。所有其他跃点大小都会调制或破坏信息,因此无法通过用于重建的常数进行归一化。
我正在尝试实现频域相移,但有几点我不确定。
1- 我能够使用跳跃大小为 50% 的汉宁 window 从正弦或扫描信号中获得完美的重建。然而,当使用跃点大小 > 50% 时,我应该如何标准化我的结果?
2- 移动低频信号的相位时(f<100,window size<1024,fs=44100)我可以清楚地看到结果中存在一些非线性。这是因为 window 尺寸对低频来说太短了吗?
非常感谢您的帮助。
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
任何低于 100 Hz 的频率在您的 FFT 中都少于两个周期 window。请注意,DFT 或 FFT 表示任何波形,包括单个非整数周期正弦波,可能是对一整串频率非常不同的正弦波求和。例如不止一个。这就是数学的原理。
对于包含少于 2 个周期的 von Hann window,这些通常是一堆几乎完全不同的频率(可能与低频的百分比相差甚远)。移动所有这些完全不同频率的相位可能会或可能不会将您的 windowed 低频正弦波移动所需的量(取决于您的信号与整数周期信号的频率有多大不同)。
同样对于低频,复共轭反射镜需要在相位的相反方向上移动,以便仍然代表完全真实的结果。所以你最终混合了 2 个重叠和相反的相位变化,如果低频信号在 DFT 孔径中远非整数周期,这又是一个主要问题。
在时间和样本中使用更长的 window 允许给定频率的更多周期适合它(因此可能需要将非常不同频率的正弦波的较小功率相加以组成,使向上或合成你的低频正弦波);并且复共轭在FFT结果bin索引方面更远,从而减少干扰。
使用 von Hann window 的任何跳跃的序列,长度为 50% /(某个整数)是无损的(除了第一个或最后一个 window)。所有其他跃点大小都会调制或破坏信息,因此无法通过用于重建的常数进行归一化。