Re: [問題] convolution的結果產生了shift已回收

看板MATLAB作者 (查無暱稱)時間16年前 (2010/02/28 13:58), 編輯推噓2(208)
留言10則, 3人參與, 最新討論串2/2 (看更多)
※ [本文轉錄自 Math 看板] 作者: olys (查無暱稱) 看板: Math 標題: Re: [微積] convolution的結果產生了shift 時間: Sun Feb 28 13:35:36 2010 : 大家好,第一次在這裡發問。 : 我最近在作訊號平滑的研究, : 手上有一維訊號f(x),還有一高斯常態分布函數g(x)(mu值設為0,sigma由演算法算出來) : 平滑的內容就是將f和g作convolution,然後取中間1/2段的部分當作結果h(x) : 但是不知道為什麼作出來的h(x)的y值和原來訊號f(x)的y值差很遠, : 找不到是什麼數學原因讓h(x)產生了類似shift的現象。 : 但平滑化倒是成功了 : 底下是圖,紅色是f(x),藍色是平滑化後的h(x) : http://olys.myweb.hinet.net/gsmooth.jpg

02/28 10:36,
設mu = 50試試看
02/28 10:36

02/28 11:50,
以 filter 角度來看,就是要 frequency=0 時 gain=1
02/28 11:50

02/28 11:51,
所以照理論推過去應該要把你目前的結果乘上 √(2π)
02/28 11:51

02/28 11:56,
不過看圖好像又不太對 = = 可以把程式放到網路上嗎?
02/28 11:56
連測試資料都放上來好了 http://olys.myweb.hinet.net/testdata.txt ===== 首先這是高斯常態分布函數產生的程式 ===== function h = gauss(ni,sigma) i_tmp = (ni / 2) - 1; t = linspace(-i_tmp,i_tmp+1); h=normpdf(t,0,sigma); ======= 主程式 ======= fid=fopen('testdata.txt','r'); %讀檔,有100筆 data=fscanf(fid,'%f',[1,inf]); data=data'; data=data.*(-1); x=linspace(1,100); y=data(x); sigma=1; h = gauss(100,sigma); %產生範圍為 -49~50, mu為0之gauss function F = convn(y,h,'same'); %convolution, 去掉頭尾只取中間100筆 plot(x,F(x),'b',x,data(x),'r'); ===== 因為我產生高斯常態分布函數的範圍為 -49~50, mu為0之gauss function, 和範圍為1~100,mu取50意思是一樣的。 也有人和我說改用conv而非convn,但用conv後再自行去頭去尾取中間得到的function 也不對,最左右兩邊波型會下墜。 有點不太清楚到底是數學問題還是程式問題了 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.127.208.68 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.127.208.68

02/28 16:31, , 1F
找到bug了 這一行要改 F = convn(y',h,'same');
02/28 16:31, 1F

02/28 16:32, , 2F
不過結果有shift一格 手動調回來就好
02/28 16:32, 2F

02/28 17:17, , 3F
真的成功了,感謝!不過為什麼y必須要先轉置呢?
02/28 17:17, 3F

02/28 17:20, , 4F
y和h轉成維度一樣再做convolution
02/28 17:20, 4F

02/28 21:30, , 5F
100x1 和 1x100 再conv嗎?
02/28 21:30, 5F

03/03 10:30, , 6F
這個程式觀念上有點怪怪的說,要做這種 DSP 的話,
03/03 10:30, 6F

03/03 10:31, , 7F
那串訊號不先處理是不能用 MATLAB 的 conv 來做的,
03/03 10:31, 7F

03/03 10:33, , 8F
雖然還是會有結果但是應該不太對。
03/03 10:33, 8F

03/03 10:34, , 9F
而且你用的 impulse response 不是從零開始取,是不是
03/03 10:34, 9F

03/03 10:34, , 10F
會造成輸出訊號的相位對不到原始訊號?
03/03 10:34, 10F
文章代碼(AID): #1BYWOG2K (MATLAB)
文章代碼(AID): #1BYWOG2K (MATLAB)