Jnny_CN 发表于 2008-5-6 14:45

[求助]用FFT方法求总谐波失真

附件是7999点的1K正弦波

我通过采集卡采集了7999点的1K正弦波数据,
我想用FFT法作出它的2,3,4,5次谐波,可是看不到,不知哪里错了,希望各位帮忙,
目的是求出总谐波失真,希望有了解的可以给些建议(我采集的这个波形按理说应该有不小于0.2%的失真),
本人是出学,还没入门,希望各位指正.谢谢

X为读入的文本,进行8192点变换,不足补零.

n=8192;
fs=64730;    //采样频率
y=fft(x,n);
fn=0:length(y)-1;
f=fs*fn/length(y);
plot( f(1:n/2),abs( y(1:n/2) ));

hcharlie 发表于 2008-5-6 14:58

因为谐波太小了,纵坐标用对数坐标画画看。另外因为旁瓣太大,应想办法减小,比如取采集频率=2.56*K*1000,K为正整数,采样点数为1024的整数倍,数据不加零,加窗。。。试试。

[ 本帖最后由 hcharlie 于 2008-5-6 15:07 编辑 ]

Jnny_CN 发表于 2008-5-6 15:26

感谢回答,我依据您的意见改了了对数坐标,如下图,基波位置基本没问题,还是分辨不出个谐波分量,看来真是要加其他手段了:-(

n=8192;
fs=64730;
y=fft(x,n);
fn=0:length(y)-1;
f=fs*fn/length(y);
plot( f(1:n/2),log(abs( y(1:n/2)/n ))); <---加了对数

songzy41 发表于 2008-5-6 16:39

2楼已指出旁辨太大,要想法减小旁辨的影响。下程序中用了blackman窗函数,因为谐波比基波还是要小得多,用对数坐标能看清。程序清单和计算结果如下。
x=load('1000.txt');
M=length(x);
x=x.*blackman(M);
N=8192;
fs=64730;
y=fft(x,N);
fn=0:N-1;
f=fs*fn/N;
plot( f(1:N/2),log(abs( y(1:N/2)))); %<---加了对数
axis(); grid;

Jnny_CN 发表于 2008-5-6 16:54

真是受益匪浅啊,非常感谢2位的帮助,谢谢.

[ 本帖最后由 eight 于 2008-5-6 18:16 编辑 ]

Jnny_CN 发表于 2008-5-7 10:23

本帖最后由 wdhd 于 2016-9-9 14:12 编辑

原帖由 songzy41 于 2008-5-6 16:39 发表
2楼已指出旁辨太大,要想法减小旁辨的影响。下程序中用了blackman窗函数,因为谐波比基波还是要小得多,用对数坐标能看清。程序清单和计算结果如下。
x=load('1000.txt');
M=length(x);
x=x.*blackman(M);
N=819 ...
您的回复给了我非常大的帮助,真是非常感谢,另外我还想请教一下我的波形数据经过FFT变换后,横坐标我知道是频率,但纵坐标代表什么呢?
是相应频率的有效值,还是什么的,在实际中怎么应用,因为我是想求总谐波失真,方法是用2,3,4,5次谐波的有效值除以基波的有效值,这个百分比就是谐波失真.
现在我的迷惑是,您为了突出小值,加了log运算,那么我实际运算中如何处理呢?期待您百忙中的回复,谢谢.

具体来说就是我还是不是很清楚FFT运算后所得数据的左坐标的实际含义

songzy41 发表于 2008-5-7 16:37

纵坐标是相对值fn/N,单位为分贝(线性幅值为1作为0分贝)。要求谐波的幅值,可在线性刻度下计算。
页: [1]
查看完整版本: [求助]用FFT方法求总谐波失真