作者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