作者monkeykkman (玴)
看板MATLAB
标题Re: [讨论] FFT与filter问题
时间Sat Nov 19 21:53:57 2011
※ 引述《silivia0916 (momo)》之铭言:
: 是说在下不是很熟悉MATLAB,
: 经过爬文及看书後还是遇到了瓶颈,
: 想请教一下各位...如果太白目请鞭小力一点>"<
: 有一笔5000点的数据,取样频率为50Hz,
: 为了做滤波,想先看FFT的频域图再做设计。
: 程式码如下:(有点长)
: ------------------------------------------------
: clear all;clc;
: load mo.xls;data = mo; %读取档案
: load_cell = data(1:4999,2); %取第二行的资料
: N = length(load_cell); %资料数量
: Fs = 50; %取样频率
: Ts = 1/Fs; %取样时间间隔
: time = (0:N-1)*Ts; %时域的时间轴刻度
: subplot(1,5,1);
: plot(time,load_cell);axis square
: axis([-inf inf 0 1]);
: title('time-domain (all data)');
: xlabel('time (s)');ylabel('load cell (N)');
: freqstep = Fs/N; %频域解析度
: freq = freqstep*(-N/2:N/2-1); %频域的频率轴刻度
: power = fft(load_cell);
: subplot(1,5,2);
: plot(freq,power);axis square
: title('frequency-domain (all data)');
: xlabel('frequency (Hz)');ylabel('power');
: y_test = ifft(power); %再转换回来看会不会一样
: subplot(1,5,3);
: plot(time,y_test);axis square
: axis([-inf inf 0 1]);
: title('time-domain (all data-reverse)');
: xlabel('time (s)');ylabel('load cell (N)');
: [b,a] = butter(5,[],'band'); %设计一个filter
: y_new = filter(b,a,load_cell);
: subplot(1,5,5);
: plot(time,y_new);axis square
: axis([-inf inf 0 1]);
: ------------------------------------------------
: 目前只写到这里,但发现有几个地方不是很清楚...
: 1. 频域轴刻度的决定
: 2. butter中bandpass的频率决定
: (因为前面的FFT出图看不出来杂讯频率...而且我觉得他怪怪的...)
: 麻烦各位帮我看一下,感谢>"<
: 如果有必要,可以直接用MSN跟我说...
电脑没灌matlab,我凭印象看了你po的程式码
1. 建议你用help fft了解 matlab内建的fft输出输入代表什麽
x为N个点的时间序列
使用 y=fft(x),输出y为N个"复数值"组成的1维阵列,
这阵列表示的是x在0~fs*(N-1)的频谱
你的程式码中plot频率刻度的部分已经平移N/2
但的fft输出却没有shift
还有既然你的fft输出用power写, 我猜你应该是想要知道讯号fft结果的大小吧?
因此你的plot(freq,power)应该要改成plot(freq,abs(fftshift(power)))
2. [b, a]=butter(order, Wn,'band')
order表示fiter的阶数, 越高效果越好同时也需要较大的计算量
Wn是正规化的截止频率(0~1), 想cut 100Hz, Wn设定成100/(fs/2)
3. 看不到杂讯可能跟你的取样频率有关
根据取样定理所能观察到的最高频率为fs/2
而你的fs只有50Hz, 最多观察到25Hz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.171.66.96
※ 编辑: monkeykkman 来自: 218.171.66.96 (11/19 21:56)
1F:推 silivia0916:>"<太感谢你了!!我再多仔细想想! 11/19 22:54