zsy1026 发表于 2007-6-18 14:53

求教关于一个离散信号的滤波问题

求教关于一个离散信号的滤波问题。

离散信号数据保存在 data.txt文件中
数据的采样频率为50kHz

期望实现的滤波要求:
只保留信号中50Hz的部分,滤除所有其他频段信号,包括直流信号
输出50Hz信号的波形和幅值

编制的matlab程序如下:

clc;
clear;
load data.txt;
Ts = 2e-005; % 采样时间间隔
N = 0.02/Ts; % 取一个周期的采样点数
x = data(1:N,1);
y = data(1:N,2);

t = fft(y); % FFT运算
t(2:end-1) = 0; % 去掉不需要的谐波
y1 = ifft(t); % FFT逆运算
A = max(abs(y1)) % 求幅值

plot(x,y,'b'); % 绘原图
hold on;
grid on;
plot(x,y1,'r') % 绘滤波后的波形

我的问题是
1.这个程序似乎不可以滤除直流部分,请问该如何解决?
2.我使用这个程序对一个标准正弦信号滤波,居然滤波后波形幅值只有原波形的一半,程序有什么错误?

zhlong 发表于 2007-6-18 15:08

http://forum.vibunion.com/forum/viewthread.php?tid=10275&highlight=%C7%F3%CA%FD%D7%D6%C2%CB%B2%A8%B5%C4FFT%CB%E3%B7%A8%CA%B5%CF%D6%B5%C4MATLAB%B4%FA%C2%EB

yangzj 发表于 2007-6-18 15:20

注意好对应的关系。第一根是对应直流,第二根和倒数第一根对应的才是你的第一谐次。

yangzj 发表于 2007-6-18 15:22

另外,为什么还要做IFFT呢,由FFT的结果可以直接得到幅值,也可得到波形

zsy1026 发表于 2007-6-18 15:30


楼上的
不知道您是不是看清了我的问题情形。。。
我要求输出50Hz信号的波形和幅值
不是频谱

另外
我希望能帮忙找到我程序的错误

还是谢谢了。

yangzj 发表于 2007-6-18 15:45

我三楼已经指出了你的错误。
我给你另外的建议是用FFT已经能得到了50Hz的幅值和相位,那波形也自然就得到了,不需要再进行IFFT,而且做IFFT我想效果不如我给你的建议

zsy1026 发表于 2007-6-18 16:30

不作ifft
怎么输出波形?

我是新手
不是很了解

楼上的再指导一下。

yangzj 发表于 2007-6-18 16:40

做FFT后,幅值A=abs(t(2))/N*2;相位就是ph=phase(t(2));
那构造一个波形 x=A*cos(2*pi*50*tn+ph)就是了。(tn是时间序列)

zsy1026 发表于 2007-6-18 17:13


谢谢楼上的
ok袅~

再多问一点
fft仅仅对一个基波周期做分析
我现在的数据有很多很多
并且数据并不一定呈严格周期性变化
如果我想对n个基波周期进行滤波
要求输出得到50Hz正弦波

应该怎么做比较合适?
谢谢

VibrationMaster 发表于 2007-6-18 17:24

t(2:end-1) = 0; % 去掉不需要的谐波
-->改成 t(1)=0;t(3:end)=0;再plot(real(ifft(t)))试一试,千万不要用plot(abs(ifft(t)))

songzy41 发表于 2007-6-18 17:25

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

原帖由 zsy1026 于 2007-6-18 14:53 发表
求教关于一个离散信号的滤波问题。

离散信号数据保存在 data.txt文件中
数据的采样频率为50kHz

期望实现的滤波要求:
只保留信号中50Hz的部分,滤除所有其他频段信号,包括直流信号
输出50Hz信号的波形 ...
这似乎有问题,采样频率为50kHz,能采到信号最高是25Hz,采不到50Hz!!

w89986581 发表于 2007-6-18 17:30

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

原帖由 songzy41 于 2007-6-18 17:25 发表

这似乎有问题,采样频率为50kHz,能采到信号最高是25Hz,采不到50Hz!!


我小说的说一句:50k哦:lol
这么高的采样率去采集50Hz的信号有些大材小用,而且给频谱分析以及滤波带来很多麻烦。
既然信号已经采集到了,需要分析50hz的线谱,只有先分级滤波降采样拉,才能有效滤除直流以及准确分析线谱能量。

[ 本帖最后由 w89986581 于 2007-6-18 17:36 编辑 ]

zsy1026 发表于 2007-6-18 17:40

50kHz还采样不了50Hz的波形?
汗ing。。。

现在工程上用的一般很少采样超过100kHz的仪器的说。。。

yangzj 发表于 2007-6-18 17:44

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

原帖由 VibrationMaster 于 2007-6-18 17:24 发表
t(2:end-1) = 0; % 去掉不需要的谐波
-->改成 t(1)=0;t(3:end)=0;再plot(real(ifft(t)))试一试,千万不要用plot(abs(ifft(t)))
负频率不能去掉,t(end)得保留。

yangzj 发表于 2007-6-18 17:51

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

原帖由 zsy1026 于 2007-6-18 17:13 发表

谢谢楼上的
ok袅~

再多问一点
fft仅仅对一个基波周期做分析
我现在的数据有很多很多
并且数据并不一定呈严格周期性变化
如果我想对n个基波周期进行滤波
要求输出得到50Hz正弦波

应该怎么做比较 ...
50KHz对50Hz采一两个周期的话,数据量还不算大,但如果采的周期过多的话,这个频率是高了些,建议用ZFFT。
当然把所有数据做FFT也是可以的。做法是一样,你把谱线和频率之间的对应关系弄清了就没问题了

补充一句,只采两个周期的话,如果能够保证整周期采样的话,而又没有非谐次成分存在的话是没问题的,但是要是不能保证这两点的话,那么加大采样长度是必要的

[ 本帖最后由 yangzj 于 2007-6-18 18:12 编辑 ]
页: [1] 2
查看完整版本: 求教关于一个离散信号的滤波问题