高频FFT结果不准确?

3
我已经对采样频率为50 KHz的逆变器50Hz输出电流进行了1分钟的采样。我应该将时间分成200ms的包(0.2秒或主信号的10个周期),并对每个包进行FFT。这意味着每个包中有10000个样本(如果不是,我会用零填充或截断,这没有太大的区别)。我还应该提取高达9 KHz的频谱。低频结果正常,但高频结果错误(值是正确值的一半)。你能帮我理解我做错了什么吗?
我有一个想法,也许像下面的代码一样的事情正在发生在我的FFT中。只需将SF更改为10000,看看结果如何改变!
in this code if you change the SF(sampling frequency) from 30000 to 10000, 
the results for high frequncies will be distorted and disordered . why ?

SF = 30000; %sampling frequency

% signal 
t = 0:1/SF:1-1/SF; %  sample points
wave=15*sin(2*pi*1*t)+1*sin(2*pi*123*t)+2*sin(2*pi*203*t)+3*sin(2*pi*223*t)+4*sin(2*pi*331*t)+5*sin(2*pi*2812*t)+6*sin(2*pi*5752*t)+7*sin(2*pi*7993*t);


wavefft = fft(wave);

L=floor(size(wave,2)/2)+1; % removing the mirror side of spectrum
MagSpec = abs(wavefft(1:L))/(SF/2);  %% removing the mirror side of the spectrum 
and ranging the domain 

plot(MagSpec);

你是否对数据包进行窗口处理?FFT 假设周期性,因此你应该在进行 FFT 之前应用窗口,否则会得到额外的高频分量。 - Paul Ratazzi
可能是因为您没有使用大小为n^2的样本窗口,所以在某个地方出现了错误结果。尝试一次使用16384或8912个样本... - Daniel Mošmondor
Paul,我认为这不是窗口化的问题,而且根据我的工作影响,我不被允许对我的数据进行窗口化处理! - Ali
Daniel,如果我使用8912或16384个样本,那么我的数据包将不再是200毫秒,而且Matlab会在我的样本之间进行插值以达到下一个2的幂次方! - Ali
1个回答

4

你所观察到的是混叠现象

通过比较使用50kHz采样率和使用10kHz采样率的结果,可以看出50kHz sampling rate10kHz sampling rate

频率低于10kHz采样率一半(Nyquist frequency)的正弦信号,即1Hz、123Hz、203Hz、223Hz、331Hz和2812Hz的正弦信号不受影响。而5752Hz和7993Hz的信号则分别混叠为4248Hz和2007Hz。

你仍然可以对200ms或10000个样本执行FFT,但采样率仍保持在50kHz。也就是说:

SF = 50000; %sampling frequency

% signal 
t = 0:1/SF:1-1/SF; %  sample points
wave=15*sin(2*pi*1*t)+1*sin(2*pi*123*t)+2*sin(2*pi*203*t)+3*sin(2*pi*223*t)+4*sin(2*pi*331*t)+5*sin(2*pi*2812*t)+6*sin(2*pi*5752*t)+7*sin(2*pi*7993*t);

对于信号生成,但您需要将生成的波形信号分成块以进行处理:

for i=1:floor(length(wave)/10000)
  wavefft = fft(wave(1+(i-1)*10000:i*10000))
  % do somthing with the wavefft result
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接