|
本帖最后由 VibInfo 于 2016-10-13 16:46 编辑
原帖由 Jnny_CN 于 2008-5-23 13:14 发表
[求助]细化一组含有谐波的正弦波数据
我通过采集卡采集了7999点的正弦波数据,想通过FFT变换看出含有的谐波,在各位的帮助下实现了FFT变换
程序如下:
...
但是结果是除了基波比较明显外,谐波分量无法很好的分辨。
在论坛里看到各位使用细化的方法提高分辨率,但我始终不得要领,求助于各位可否帮忙实现,我的目的就是分辨2,3,4,5次谐波分量(按理说在200,300,400,500处)
另外还想请教各位是否还有什么其他的办法可以有效提取谢波分量,谢谢。
附件是1组采样频率约为64710的7999点100Hz正弦波数据,希望各位可以帮忙分析一下,谢谢。
另外我用相同的程序处理1Khz,2Khz的数据就基本可以分辨出谐波分量,但是500Hz,400Hz,.....那些小的低频的数据就无法很好的区分,不知为何,希望帮忙分析,
所有数据的采集频率都是一样的,约为64710,感觉源信号的频率越低,越是无法分辨谐波分量,恳请大家帮忙。
对楼主希望加强谐波分量可以用多通带滤波器来实现,而不必用细化方法,因为细化的话也一样把谐波附近的干扰也细化了。我对1000Hz做分析,用FIR滤波器,程序和图如下,可以看到处理后谐波分量明显增强了。对于低于1000Hz的频率,一样也可以用本方法,但滤波器带宽必须选择更窄,这样势必要求滤波器有更高的阶数,在这种情况下建议降低采样频率(下采样)后再处理。
x=load('1000.0.txt');
x1=x-mean(x);
x2=x1.*hanning(length(x1));
n=8192;
fs=64709;
y=fft(x2,n);
fn=0:length(y)-1;
f=fs*fn/length(y);
mag=abs(y)*2/n*2;
plot( f(1:n/2),20*log10(mag(1:n/2)));
axis([0 10000 -140 0.5]); grid;
title('Original Signal Spectrum');
ylabel('dB'); xlabel('Frequency (Hz)');
figure
ff=0;
Am=0;
for k=1 : 5
fre1=(fre*k-300)/(fs/2);
fre2=(fre*k-100)/(fs/2);
fre3=(fre*k+100)/(fs/2);
fre4=(fre*k+300)/(fs/2);
ff=[ff fre1 fre2 fre3 fre4];
Am=[Am 0 1 1 0];
end
ff=[ff 1];
Am=[Am 0];
b=firls(201,ff,Am);
%freqz(b,1);
[db, mag, pha, grd,w]=freqz_m(b,1);
plot(fs*w/2/pi,db);
axis([0 10000 -60 0.5]); grid;
title('Respeonse of multi-band Filter');
ylabel('dB'); xlabel('Frequency (Hz)');
figure
x3=filter(b,1,x1);
x2=x3.*hanning(length(x3));
n=8192;
fs=64709;
y=fft(x2,n);
fn=0:length(y)-1;
f=fs*fn/length(y);
mag=abs(y)*2/n*2;
plot( f(1:n/2),20*log10(mag(1:n/2)));
axis([0 10000 -140 0.5]); grid;
title('Signal Spectrum after multi-band Filtering');
ylabel('dB'); xlabel('Frequency (Hz)'); |
-
原始信号的谱图
-
滤波器的幅值响应曲线
-
滤波后的谱图
|