當前位置:首頁 » 編程語言 » 離散卷積c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

離散卷積c語言

發布時間: 2022-01-14 13:06:16

Ⅰ 用MATLAB怎麼實現離散信號的卷積啊 編程

在MATLAB中,可以用函數y=filter(p,d,x)實現差分方程的模擬,也可以用函數 y=conv(x,h)計算卷積。
(1)即y=filter(p,d,x)用來實現差分方程,d表示差分方程輸出y的系數,p表示輸入x的系數,而x表示輸入序列。輸出結果長度數等於x的長度。
實現差分方程,先從簡單的說起:
filter([1,2],1,[1,2,3,4,5]),實現y[k]=x[k]+2*x[k-1]
y[1]=x[1]+2*0=1 (x[1]之前狀態都用0)
y[2]=x[2]+2*x[1]=2+2*1=4
(2)y=conv(x,h)是用來實現卷級的,對x序列和h序列進行卷積,輸出的結果個數等於x的長度與h的長度之和減去1。
卷積公式:z(n)=x(n)*y(n)= ∫x(m)y(n-m)dm.
程序一:以下兩個程序的結果一樣
(1)h = [3 2 1 -2 1 0 -4 0 3]; % impulse response
x = [1 -2 3 -4 3 2 1]; % input sequence
y = conv(h,x);
n = 0:14;
subplot(2,1,1);
stem(n,y);
xlabel('Time index n'); ylabel('Amplitude');
title('Output Obtained by Convolution'); grid;
(2)x1 = [x zeros(1,8)];
y1 = filter(h,1,x1);
subplot(2,1,2);
stem(n,y1);
xlabel('Time index n'); ylabel('Amplitude');
title('Output Generated by Filtering'); grid;

程序二:filter和conv的不同
x=[1,2,3,4,5];
h=[1,1,1];
y1=conv(h,x)
y2=filter(h,1,x)
y3=filter(x,1,h)
結果:y1 = 1 3 6 9 12 9 5
y2 = 1 3 6 9 12
‍ y3 = 1 3 6
可見:filter函數y(n)是從n=1開始,認為所有n<1都為0;而conv是從卷積公式計算,包括n<1部分。
因此filter 和conv 的結果長短不同
程序三:濾波後信號幅度的變化
num=100; %總共1000個數
x=rand(1,num); %生成0~1隨機數序列
x(x>0.5)=1;
x(x<=0.5)=-1;
h1=[0.2,0.5,1,0.5,0.2];
h2=[0,0,1,0,0];
y1=filter(h1,1,x);
y2=filter(h2,1,x);
n=0:99;
subplot(2,1,1);
stem(n,y1);
subplot(2,1,2);
stem(n,y2);

MATLAB中提供了卷積運算的函數命令conv2,其語法格式為:
C = conv2(A,B)
C = conv2(A,B)返回矩陣A和B的二維卷積C。若A為ma×na的矩陣,B為mb×nb的矩陣,則C的大小為(ma+mb-1)×(na+nb-1)。

例:
A=magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> B=[1 2 1 ;0 2 0;3 1 3]
B =
1 2 1
0 2 0
3 1 3
>> C=conv2(A,B)
C =
17 58 66 34 32 38 15
23 85 88 35 67 76 16
55 149 117 163 159 135 67
79 78 160 161 187 129 51
23 82 153 199 205 108 75
30 68 135 168 91 84 9
33 65 126 85 104 15 27
MATLAB圖像處理工具箱提供了基於卷積的圖象濾波函數filter2,filter2的語法格式為:
Y = filter2(h,X)
其中Y = filter2(h,X)返回圖像X經運算元h濾波後的結果,默認返回圖像Y與輸入圖像X大小相同。例如:
其實filter2和conv2是等價的。MATLAB在計算filter2時先將卷積核旋轉180度,再調用conv2函數進行計算。
Fspecial函數用於創建預定義的濾波運算元,其語法格式為:
h = fspecial(type)
h = fspecial(type,parameters)
參數type制定運算元類型,parameters指定相應的參數,具體格式為:
type='average',為均值濾波,參數為n,代表模版尺寸,用向量表示,默認值為[3,3]。
type= 'gaussian',為高斯低通濾波器,參數有兩個,n表示模版尺寸,默認值為[3,3],sigma表示濾波器的標准差,單位為像素,默認值為0.5

Ⅱ 用c語言做這個離散卷積

inti=0,n=100,y[n],x[n],h[n];//首先請把數據初始化了
while(i++<n)
{
intk=0,y[i=0];
while(k++<i)
{
y[i]+=y[i]+x[k]*h[i-k];
}
}

Ⅲ C語言用子函數實現卷積

conv(intu[],intv[],intw[],intm,intn)
{
inti,j;

intk=m+n-1;

for(i=0;i<k;i++)
for(j=max(0,i+1-n);j<=min(i,m-1);j++)
{
w[i]+=u[j]*v[i-j];
}
}

u[],v[]為原始數組,m,n分別為數組長度,w[]為卷積結果(w[]需初始化為0),其長度為m+n-1

Ⅳ 離散卷積的公式

「離散卷積」是兩個離散序列和之間按照一定的規則將它們的有關序列值分別兩兩相乘再相加的一
種特殊的運算。具體可用公式表示為

其中就是經過卷積運算以後所得到的一個新的序列。根據上式,在運算過程中,要使序列「不動」,並將自變數改為,以表示與卷積結果的自變數有所區別。而將另外一個序列的自變數改為i以後,再取它對於縱坐標的「鏡像」(式中的「-」號即是此意)。為求兩者的卷積,先將在相同的下與的每一個值兩兩相乘再相加,就得到了時的卷積值。接下來,將向右移動自變數的一個間隔,構成,同樣在相同的下與的各個值兩兩相乘再相加,就得到卷積值,……,如此反復,直到所有的序列值都算完為止。其中要注意,對於的卷積值,要把向右移,而對於的卷積值,要把向左移。

Ⅳ 用C語言做離散卷積運算

暴力N ^ 2可以直接乘,直接雙重循環即可,要快的話可以用NlogN的FFT。

Ⅵ 離散卷積和循環卷積的計算機C語言計算

卷積可以將 兩個數列分別做FFT 在對應相乘 ,在做IFFT 。
好像一般軟體沒有相應的函數,直接用FFT 和IFFT 也挺方便的 。你簡單組合一下就行了

Ⅶ c語言,急求寫一個離散數組卷積的程序,能夠直接運行的

include <stdio.h>
#include <stdlib.h>

conv(int *u,int *v, int m, int n);

void main()
{
int i = 0;
int a[4] = {3,10,13,22};
int b[5] = {6,2,15,4,1};

int m = sizeof(a)/sizeof(a[0]);
int n = sizeof(b)/sizeof(b[0]);
conv(a,b,m,n);
}

conv(int u[],int v[], int m, int n)
{
int i, j;

int k = m+n-1;
int w[10]={0};

for(i=0; i<k; i++){
for(j=max(0,i+1-n); j<=min(i,m-1); j++){
w[i] += u[j]*v[i-j];
}
printf("%d/n",w[i]);
}
}

Ⅷ 如何用C語言實現數組的卷積過程~~~

積分為線性卷積,和圓形卷積。而題目是線性卷積,然後是所求的結果個數是上面兩個數組 個數的和減去1
比如上面h數組裡面單元是5 而x數組 是4
所以肯定一點是結果是等於8個數的
result[(sizeof(h) + sizeof(x)) / sizeof(double) - 1];這個就可以說明了
第二個知識點是卷積是怎麼求的。第一步肯定是判斷兩個數組 那個長度長
conv(x, h, sizeof(x) / sizeof(x[0]), sizeof(h) / sizeof(h[0]), result); 就是實現這個目標的。
然後是長度長的放前面
好吧 我換個 數字來就把
x【】=
h【】=
然後卷積 一個是 x0*h0=1;實現語句 是第一個
for (int i = 0; i < lenH; i++)
{
for (int j = 0; j <= i; j++)
result[i] += x[j] * h[i - j];
}
此時 已經要轉入第二步驟了:
for (int m = lenH; m < lenX; m++){
for (int j = 0; j <lenH; j++)
result[m] += x[m - j] * h[j];
}
第二部 應該是 x*h+x1*h(1-1)= 這里得h1 用0代替 但程序里 不是這樣 而是 用x*h=
好吧 我可能設置的h數組不夠長 加入 h有兩個。x有
那麼 結果 應該是x2*y1+x1*y0;
然後是第三部
是說 在要求的 結果 最後幾個數字時候 比如原題裡面 應該是有8個的。但到第二個循環才求到X得長度5個。
所以 後面應該是resual記住 數組下標 比實際小1. 所以
是這樣的
用 for (int n = lenX; n < lenX + lenH - 1; n++){
for (int j = i - lenX + 1; j < lenH; j++)
result[n] += x[n - j] * h[j];
}裡面的i 要改成n
for (int n = lenX; n < lenX + lenH - 1; n++){
for (int j = n - lenX + 1; j < lenH; j++)
result[n] += x[n - j] * h[j];
}
然後 是這樣分析的
結果等於=x(0)h(5-0)+x(1)h(5-1)+x(2)h(5-2)+x(3)h(5-3)=x(0)h(5)+x(1)h(4)+x(2)h(3)+x(3)h(2) 記住 數組不夠的地方 用0代替
(result, &result[8], ostream_iterator<double>(cout, " ")); 這個函數 就不想說了 自己去看stl 演算法吧
另外,虛機團上產品團購,超級便宜

Ⅸ Visual C++實現離散序列圓周卷積

這個我來回答一下吧, 雖然我是學物理的, 但是我考過北郵的通信專業, 自學通信原理, 雖然只考110但分數不無論是單科還是總分都是還我們小組當年最高的.
不用再追加其它分數了, 把我的採納為最佳答案尊重下勞動成果就行了.
有其它問題可以再聯系, 原來代碼錯誤的部分我已經加了注釋, 可以運行了.
代碼如下:
#include <iostream>
using namespace std;

void Cir_conv(double[],double[],int,int); //函數聲明放在main函數外面
void main()
{
double h[]={1.1,1.2,1.8} , x[]={1.9,2.8,3.0,1.9,3.7};
int N1=sizeof(h)/sizeof(double) , N2=sizeof(x)/sizeof(double); // 這兒有筆誤, 原來是N2=sizeof(double)/sizeof(double)
Cir_conv(h,x,N1,N2);
}

void Cir_conv(double h[],double x[],int h_size,int x_size)
{
double *y1=NULL;
y1=new double [h_size+x_size-1];
double *h1=NULL;
h1=new double[h_size+x_size-1];

for (int i=0;i<h_size+x_size-1;i++)
{
if (i<h_size)
h1[i]=h[i];
else
h1[i]=0;
}

double *x1=NULL;
x1=new double[h_size+x_size-1];
for(int p=0;p<h_size+x_size-1;p++)
{
if (p<x_size)
x1[p]=x[p];
else
x1[p]=0;
}

for(int k=0;k<h_size+x_size-1;k++)
{
y1[k]=0; //這兒是原來最大的錯誤, 忘記賦初值了
for(int j=0,m=k;j<=k&&m>=0;j++,m--) //這兒原來多了一個int
y1[k]+= h1[j]*x1[m];
}

for (int n=0;n<h_size+x_size-1;n++)
{
cout<<y1[n]<<" ";
if((n+1)%5==0) cout<<endl;
// cout<<endl; //這句應該沒用, 原來的代碼意思應該是每行放五個, 所以這行沒有用了
}

}

Ⅹ 卷積積分的C語言程序

代碼並不長,建議單步運行去看看,看走到哪一步時結果與你想像的不一致,再分析那一段代碼...