如果我们取单个正弦波的 STFT,并在实虚平面上绘制对应于载波频率的值,它应该是多少个点?

If we take STFT of a single sinusoid, and plot the value corresponding to carrier frequency in real imaginary plane, how many points should it be?

我创建了一个频率为 550Hz 持续 1 秒的正弦波

fs=44100;
Duration=1;  %second
Len=Duration * fs;  %length of sinusoid
t=(0:Len-1)/fs;
x=sin(2*pi*550*t);

出于探索和学习的目的,我决定对这个信号进行短时傅里叶变换。我是这样做的:

window_len=0.02*fs;  %length of the window
hop=window_len/3;    %hop size
nfft=2^nextpow2(window_len);
window=hamming(window_len,'periodic');
[S,f,t]=spectrogram(x,window,hop,nfft,fs);

现在我想绘制频率等于 550 的 S 的实部与虚部值,看看会发生什么。首先,在频率矢量中我没有确切的 550。只有一个 516.5 和 559.6。所以,我只是看了看频谱图,然后选择了最接近它的那个,然后选择了那个。当我尝试为我选择的频率(在所有时间范围内)绘制 S 的实部与虚部时,如附图所示,这些值都落在 3 个点内。为什么是三分?

每个 STFT window 可以具有不同的复杂相位,具体取决于 window 的开始(或中间)如何与正弦波周期同步(或不同步)。因此,峰值 DFT 结果 bin 的实复数 IQ 图可以是圆形散点图,具体取决于 DFT 的数量 windows 以及步进距离(或长度 - 重叠)与周期之间的比率正弦曲线。

不同 windows 的 STFT 系数的相位取决于 window "sees" 的数据。因此,对于您对 window 长度和跳跃的特定选择,碰巧当您滑过单频正弦波时,您 window "sees" 只有三个不同的数据块。要明白我的意思,只需绘制:

plot(x(1:window_len),'x')

plot(x(1+hop:window_len+hop),'x')

plot(x(1+2*hop:window_len+2*hop),'x')

plot(x(1+3*hop:window_len+3*hop),'x')

..如果你继续你会看到模式重复自己,例如,第一个情节与第四个相同,第二个与第五个等。因此你只有三个不同的实虚零件组合。

当然,如果你改变window长度和hopsize,这会改变,你会得到更多的分数。例如,try

window_len =nfft;

hop=ceil(window_len/4)

希望对您有所帮助。