文章目錄
- 一、卷積計算原理
- 二、卷積計算
- 1、計算 y(0)
- 2、計算 y(1)
- 3、計算 y(2)
- 三、使用 matlab 計算卷積
- 四、使用 C 語言實作卷積計算
一、卷積計算原理
對于 線性時不變系統 ( LTI - Linear time-invariant ) 來說 ,
假設 x ( n ) x(n) x(n) 是 LTI 系統的 " 輸入序列 " , y ( n ) y(n) y(n) 是 " 輸出序列 " ,
則有 :
y ( n ) = ∑ m = ? ∞ + ∞ x ( m ) h ( n ? m ) = x ( n ) ? h ( n ) y(n) = \sum^{+\infty}_{m = -\infty} x(m) h(n-m) = x(n) * h(n) y(n)=m=?∞∑+∞?x(m)h(n?m)=x(n)?h(n)
線性時不變系統 ( LTI - Linear time-invariant ) 的
" 輸出序列 "
等于
" 輸入序列 " 與 " 系統單位脈沖回應 " 的 線性卷積 ;
輸出序列 的元素個數 : 輸 出 序 列 元 素 個 數 = 輸 入 序 列 元 素 個 數 + 單 位 脈 沖 響 應 序 列 元 素 個 數 ? 1 輸出序列元素個數 = 輸入序列元素個數 + 單位脈沖回應序列元素個數 - 1 輸出序列元素個數=輸入序列元素個數+單位脈沖響應序列元素個數?1
二、卷積計算
給定 輸入序列 :
x ( n ) = { 1 , 2 } [ 0 , 1 ] x(n) = \{1,2\}_{[0, 1]} x(n)={1,2}[0,1]?
單位脈沖回應 :
h ( n ) = { 1 , 2 } [ 0 , 1 ] h(n) = \{1,2\}_{[0, 1]} h(n)={1,2}[0,1]?
計算卷積 : x ( n ) ? h ( n ) x(n) * h(n) x(n)?h(n) ;
卷積結果序列對應的元素個數是 2 + 2 ? 1 = 3 2 + 2 - 1 = 3 2+2?1=3
根據如下 卷積 公式 :
y ( n ) = ∑ m = ? ∞ + ∞ x ( m ) h ( n ? m ) = x ( n ) ? h ( n ) y(n) = \sum^{+\infty}_{m = -\infty} x(m) h(n-m) = x(n) * h(n) y(n)=m=?∞∑+∞?x(m)h(n?m)=x(n)?h(n)
x ( n ) ? h ( n ) = ∑ m = ? ∞ + ∞ x ( m ) h ( n ? m ) x(n) * h(n) = \sum^{+\infty}_{m = -\infty} x(m) h(n-m) x(n)?h(n)=m=?∞∑+∞?x(m)h(n?m)
1、計算 y(0)
計算 y ( 0 ) y(0) y(0) :
∑ m = ? ∞ + ∞ x ( m ) h ( 0 ? m ) \sum^{+\infty}_{m = -\infty} x(m) h(0-m) m=?∞∑+∞?x(m)h(0?m)
m m m 取值 [ ? ∞ , + ∞ ] [-\infty, +\infty] [?∞,+∞]
m < 0 m < 0 m<0 時 , 有 x ( m ) = 0 x(m) = 0 x(m)=0 , 則 x ( m ) h ( n ? m ) = 0 x(m) h(n-m) = 0 x(m)h(n?m)=0 , 累加沒有意義 ;
m = 0 m = 0 m=0 時 , 有 x ( 0 ) h ( 0 ? 0 ) = x ( 0 ) h ( 0 ) = 1 × 1 = 1 x(0)h(0 - 0) = x(0)h(0) = 1 \times 1 = 1 x(0)h(0?0)=x(0)h(0)=1×1=1
m ≥ 1 m \geq 1 m≥1 時 , 有 h ( n ? m ) = h ( 0 ? m ) = 0 h(n - m) = h(0 - m) = 0 h(n?m)=h(0?m)=0 , 則 x ( m ) h ( n ? m ) = 0 x(m)h(n - m) = 0 x(m)h(n?m)=0 , 累加沒有意義 ;
最終 :
y ( 0 ) = x ( 0 ) h ( 0 ) = 1 × 1 = 1 y(0) = x(0)h(0)= 1 \times 1 = 1 y(0)=x(0)h(0)=1×1=1
2、計算 y(1)
計算 y ( 1 ) y(1) y(1) :
∑ m = ? ∞ + ∞ x ( m ) h ( 1 ? m ) \sum^{+\infty}_{m = -\infty} x(m) h(1-m) m=?∞∑+∞?x(m)h(1?m)
m m m 取值 [ ? ∞ , + ∞ ] [-\infty, +\infty] [?∞,+∞]
m < 0 m < 0 m<0 時 , 有 x ( m ) = 0 x(m) = 0 x(m)=0 , 則 x ( m ) h ( n ? m ) = 0 x(m) h(n-m) = 0 x(m)h(n?m)=0 , 累加沒有意義 ;
m = 0 m = 0 m=0 時 , 有 x ( m ) h ( n ? m ) = x ( 0 ) h ( 1 ? 0 ) = x ( 0 ) h ( 1 ) = 1 × 2 = 2 x(m) h(n-m) = x(0)h(1 - 0) = x(0)h(1) = 1 \times 2 = 2 x(m)h(n?m)=x(0)h(1?0)=x(0)h(1)=1×2=2
m = 1 m = 1 m=1 時 , 有 x ( m ) h ( n ? m ) = x ( 1 ) h ( 1 ? 1 ) = x ( 1 ) h ( 0 ) = 2 × 1 = 2 x(m) h(n-m) = x(1)h(1 - 1) = x(1)h(0) = 2 \times 1 = 2 x(m)h(n?m)=x(1)h(1?1)=x(1)h(0)=2×1=2
m ≥ 2 m \geq 2 m≥2 時 , 有 h ( n ? m ) = h ( 2 ? m ) = 0 h(n - m) = h(2 - m) = 0 h(n?m)=h(2?m)=0 , 則 x ( m ) h ( n ? m ) = 0 x(m)h(n - m) = 0 x(m)h(n?m)=0 , 累加沒有意義 ;
最終 :
y ( 1 ) = x ( 0 ) h ( 1 ) + x ( 1 ) h ( 0 ) = 2 + 2 = 4 y(1) = x(0)h(1)+x(1)h(0) = 2 + 2 = 4 y(1)=x(0)h(1)+x(1)h(0)=2+2=4
3、計算 y(2)
計算 y ( 2 ) y(2) y(2) :
∑ m = ? ∞ + ∞ x ( m ) h ( 2 ? m ) \sum^{+\infty}_{m = -\infty} x(m) h(2-m) m=?∞∑+∞?x(m)h(2?m)
m m m 取值 [ ? ∞ , + ∞ ] [-\infty, +\infty] [?∞,+∞]
m < 0 m < 0 m<0 時 , 有 x ( m ) = 0 x(m) = 0 x(m)=0 , 則 x ( m ) h ( n ? m ) = 0 x(m) h(n-m) = 0 x(m)h(n?m)=0 , 累加沒有意義 ;
m = 0 m = 0 m=0 時 , 有 x ( m ) h ( n ? m ) = x ( 0 ) h ( 2 ? 0 ) = x ( 0 ) h ( 2 ) = 1 × 0 = 0 x(m) h(n-m) = x(0)h(2 - 0) = x(0)h(2) = 1 \times 0 = 0 x(m)h(n?m)=x(0)h(2?0)=x(0)h(2)=1×0=0 , h h h 僅在 0 , 1 0,1 0,1 索引有值 , 2 2 2 索引值為 0 ;
m = 1 m = 1 m=1 時 , 有 x ( m ) h ( n ? m ) = x ( 1 ) h ( 2 ? 1 ) = x ( 1 ) h ( 1 ) = 2 × 2 = 4 x(m) h(n-m) = x(1)h(2 - 1) = x(1)h(1) = 2 \times 2 = 4 x(m)h(n?m)=x(1)h(2?1)=x(1)h(1)=2×2=4
m ≥ 2 m \geq 2 m≥2 時 , 有 h ( n ? m ) = h ( 2 ? m ) = 0 h(n - m) = h(2 - m) = 0 h(n?m)=h(2?m)=0 , 則 x ( m ) h ( n ? m ) = 0 x(m)h(n - m) = 0 x(m)h(n?m)=0 , 累加沒有意義 , h h h 僅在 0 , 1 0,1 0,1 索引有值 , 小于 0 0 0 的索引值為 0 ;
最終 :
y ( 1 ) = x ( 0 ) h ( 1 ) + x ( 1 ) h ( 0 ) = 0 + 4 = 4 y(1) = x(0)h(1)+x(1)h(0) = 0 + 4 = 4 y(1)=x(0)h(1)+x(1)h(0)=0+4=4
三、使用 matlab 計算卷積
matlab 原始碼 :
x = [1, 2];
h = [1, 2];
y = conv(x, h);
最終計算結果 : y ( n ) = { 1 , 4 , 4 } [ 0 , 2 ] y(n) = \{1,4,4\}_{[0,2]} y(n)={1,4,4}[0,2]?

四、使用 C 語言實作卷積計算
從百度百科找了個原始碼 : convolution 是卷積計算的函式 , 僅做參考 ;
void convolution(double *input1, double *input2, double *output, int mm, int nn)
{
double *xx = new double[mm + nn - 1];
// do convolution
for (int i = 0; i < mm + nn - 1; i++)
{
xx[i] = 0.0;
for (int j = 0; j < mm; j++)
{
if (i - j >= 0 && i - j < nn)
xx[i] += input1[j] * input2[i - j];
}
}
// set value to the output array
for (int i = 0; i < mm + nn - 1; i++)
output[i] = xx[i];
delete[] xx;
}
原始碼參考 https://baike.baidu.com/item/卷積 百度百科 ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/432140.html
標籤:AI
上一篇:Pytorch中使用torchvision實作deform_conv2d
下一篇:為Linux應用添加按鍵控制
