Jnny_CN 发表于 2008-5-23 13:14

[求助]细化一组含有谐波的正弦波数据

[求助]细化一组含有谐波的正弦波数据

我通过采集卡采集了7999点的正弦波数据,想通过FFT变换看出含有的谐波,在各位的帮助下实现了FFT变换
程序如下:
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)));

但是结果是除了基波比较明显外,谐波分量无法很好的分辨。

在论坛里看到各位使用细化的方法提高分辨率,但我始终不得要领,求助于各位可否帮忙实现,我的目的就是分辨2,3,4,5次谐波分量(按理说在200,300,400,500处)

另外还想请教各位是否还有什么其他的办法可以有效提取谢波分量,谢谢。

附件是1组采样频率约为64710的7999点100Hz正弦波数据,希望各位可以帮忙分析一下,谢谢。


另外我用相同的程序处理1Khz,2Khz的数据就基本可以分辨出谐波分量,但是500Hz,400Hz,.....那些小的低频的数据就无法很好的区分,不知为何,希望帮忙分析,

所有数据的采集频率都是一样的,约为64710,感觉源信号的频率越低,越是无法分辨谐波分量,恳请大家帮忙。

Jnny_CN 发表于 2008-5-23 13:37

为方便各位帮忙,我把从20Hz---10,000Hz的1/24倍频程的正弦波数据打包传到了网盘(5兆多,论坛附件有限制),

都是7999点的,采样频率约为64710,信号频率为各个相应的文件名。

这些数据是实测数据,失真度按理说绝对不大于5%(确切说小到1%),希望可以为需要的人作为实验数据。谢谢

数据地址:http://www.fs2you.com/files/7bd1691c-288a-11dd-8e23-0014221f4662/

songzy41 发表于 2008-5-23 19:58

本帖最后由 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(); 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=;
    Am=;
end
ff=;
Am=;
b=firls(201,ff,Am);
%freqz(b,1);
=freqz_m(b,1);
plot(fs*w/2/pi,db);
axis(); 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(); grid;
title('Signal Spectrum after multi-band Filtering');
ylabel('dB'); xlabel('Frequency (Hz)');

zhwang554 发表于 2008-5-24 21:23

全相位谱波分析

用全相位FFT分析200.txt,500.txt,1000.txt,2000.txt结果如下

N=2048, 红线为apFFT, 兰线为FFT







(请版主帮助打开贴上,我不会操作,以便观看)

[ 本帖最后由 zhwang554 于 2008-5-24 22:02 编辑 ]

Jnny_CN 发表于 2008-5-25 10:31

谢谢两位的帮助,我马上试试看:handshake

Jnny_CN 发表于 2008-5-25 10:38

本帖最后由 VibInfo 于 2016-10-13 16:46 编辑

原帖由 songzy41 于 2008-5-23 19:58 发表

对楼主希望加强谐波分量可以用多通带滤波器来实现,而不必用细化方法,因为细化的话也一样把谐波附近的干扰也细化了。我对1000Hz做分析,用FIR滤波器,程序和图如下,可以看到处理后谐波分量明显增强了。对
于低于1 ...
还要请问您,为何对于低频要降低采样率呢?这样做有什么好处呢?

songzy41 发表于 2008-5-25 16:43

本帖最后由 VibInfo 于 2016-10-13 16:47 编辑

原帖由 Jnny_CN 于 2008-5-25 10:38 发表
还要请问您,为何对于低频要降低采样率呢?这样做有什么好处呢?

你可以从程序中看到,在1000Hz时,我用的滤波器带宽为200Hz,当对于低频时,就不能用这样的带宽了。在200Hz带宽时用的滤波器阶数是201,当频带变窄,中心频率降低,为了能得到满意的频响,势必要把滤波器阶数增加,这样计算量就会增加很多。
楼主不妨试一下,用上程序处理低频会有什么效果。

zhwang554 发表于 2008-5-25 20:06

低频长数据

100.txt谐波分析谐波峰不明显的原因是数据长度不够,数据越长频谱间隔越小,100Hz中谱线越多,泄漏减小.
现数据长7999,我把它尽量连续接起来,变成15779长,对这长度作DFT分析,得下图



版主能否提供低频长数据
或者降低取样频率,100Hz信号用1000赫就足够了,数据也可少多了.

柚主在1柚提供的100.txt频谱图中波峰还是很明显的,它是50Hz的倍频

2柚
数据地址:http://www.fs2you.com/files/7bd1691c-288a-11dd-8e23-0014221f4662/
下载不了


[ 本帖最后由 zhwang554 于 2008-5-25 22:08 编辑 ]

Jnny_CN 发表于 2008-5-25 21:51

本帖最后由 VibInfo 于 2016-10-13 16:47 编辑

原帖由 zhwang554 于 2008-5-25 20:06 发表
100.txt谐波分析谐波峰不明显的原因是数据长度不够,数据越长频谱间隔越小,100Hz中谱线越多,泄漏减小.
现数据长7999,我把它尽量连续接起来,变成15779长,对这长度作DFT分析,得下图

35055

版主能否提供低频长数据 ...

数据可以下载啊,我刚刚试了一下,firedox,ie7督可以阿,您可以在试试,实在不行的话您可以留下邮件地址,我可以用邮件把数据发给您,谢谢您的帮助。

Jnny_CN 发表于 2008-5-25 21:54

本帖最后由 VibInfo 于 2016-10-13 16:47 编辑

原帖由 songzy41 于 2008-5-25 16:43 发表

你可以从程序中看到,在1000Hz时,我用的滤波器带宽为200Hz,当对于低频时,就不能用这样的带宽了。在200Hz带宽时用的滤波器阶数是201,当频带变窄,中心频率降低,为了能得到满意的频响,势必要把滤波器阶数增加, ...
谢谢您的帮助,我正在用您的程序进行试验,谢谢您。

Jnny_CN 发表于 2008-5-26 09:10

本帖最后由 VibInfo 于 2016-10-13 16:47 编辑

原帖由 songzy41 于 2008-5-23 19:58 发表

对楼主希望加强谐波分量可以用多通带滤波器来实现,而不必用细化方法,因为细化的话也一样把谐波附近的干扰也细化了。我对1000Hz做分析,用FIR滤波器,程序和图如下,可以看到处理后谐波分量明显增强了。对于低于1 ...

您好,您的程序中freqz_m这个函数我用的Matlab 2007a这里面没有啊,不知您可否贴出来让我学习一下。十分感谢,
另外我还像向您请教,我要用您传授的方法对100,200,500Hz的数据进行多带通滤波,那么滤波器阶数该如何确定呢?有什么方法可以遵循呢?谢谢。

songzy41 发表于 2008-5-26 16:35

本帖最后由 VibInfo 于 2016-10-13 16:47 编辑

原帖由 Jnny_CN 于 2008-5-26 09:10 发表

您好,您的程序中freqz_m这个函数我用的Matlab 2007a这里面没有啊,不知您可否贴出来让我学习一下。十分感谢,
另外我还像向您请教,我要用您传授的方法对100,200,500Hz的数据进行多带通滤波,那么滤波器阶数该如何确定呢?有什么方法可以遵循呢?谢谢。

freqz_m函数如下:
function =freqz_m(b,a);
%Modified version of freqz subroutine
=freqz(b,a,1000,'whole');
H=(H(1:501))'; w=(w(1:501))';
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
grd=grpdelay(b,a,w);
我没有看到过对于多带宽FIR滤波器设计中N的求法,在上程序中我是试了几次,没有计算阶数N。如果要计算阶数,我想可把陈怀琛的“数字信号处理教程:MATLAB释义与实现”一书中对最优化等波动FIR滤波器设计中N计算方法作参考。

zhwang554 发表于 2008-6-1 17:16

重构原信号及其谱波

如果用离散频谱校正法(最近论坛贴子上介绍能量中心法,比值法程序)求出基波及其4个谐波的振幅值,相位值,频率值,重构一个信号,这个信号和原信号基本一样,但振幅谱的谱波清晰,


下图是500.0txt结果
兰色原信号的振幅谱, 红色重构信号的振幅谱



[ 本帖最后由 zhwang554 于 2008-6-1 17:21 编辑 ]

TestGuru 发表于 2008-6-1 19:45

楼主的100Hz信号谐波分量不明显,也许有以下原因:

1. 也许它的谐波本来就小(楼主不是说THD小到1%吗,我算了一下在应在1%~0.5%之间)。窃以为用滤波器只是人为将谐波突出来。
2. 如zhwang554说的,数据长度不够,FFT分辨率仅为:7.899HZ,相对与100HZ来说,较粗糙
3.由于采集的不是100HZ信号周期的整数倍分析,虽然说加窗,但还是有泄漏。

下图用校正法校正了峰值频率的位置, 校正前应为94.8HZ或102.7HZ, 校正后正好100HZ。

[ 本帖最后由 TestGuru 于 2008-6-1 19:51 编辑 ]

Jnny_CN 发表于 2008-6-2 12:30

真是受教了,谢谢各位的帮助:handshake
页: [1] 2
查看完整版本: [求助]细化一组含有谐波的正弦波数据