求matlab中的conv2卷积函数用c++怎么实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求matlab中的conv2卷积函数用c++怎么实现相关的知识,希望对你有一定的参考价值。
参考技术A function a=myconv(b,c) bs=size(b); cs=size(c); i=any(bs-cs); if i error('error') end i=any(~(bs-1)); if ~i error('error') end ko=0; if bs(1)>bs(2) b=b'; c=c'; ko=1; end bs=size(b); cs=size(c); ss=2*bs(2)-1; a=zeros(1,ss); for i...本回答被提问者和网友采纳数字信号处理卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )
文章目录
一、Matlab 卷积和多项式乘法 conv 函数
Matlab 文档地址 : https://ww2.mathworks.cn/help/matlab/ref/conv.html
函数语法 :
// 返回向量 u 和 v 的卷积。如果 u 和 v 是多项式系数的向量,对其卷积与将这两个多项式相乘等效。
w = conv(u,v)
// 返回如 shape 指定的卷积的分段。
// 例如,conv(u,v,'same') 仅返回与 u 等大小的卷积的中心部分,
// 而 conv(u,v,'valid') 仅返回计算的没有补零边缘的卷积部分。
w = conv(u,v,shape)
u u u 是 " 输入序列 " , v v v 是 " 单位脉冲响应 " ;
二、使用 matlab 代码求卷积并绘图
求下面的 " 线性时不变系统 " 的 输出序列 ;
输入序列 : x ( n ) = s i n ( 2 π f 0 n / F s ) , 0 ≤ n ≤ 127 x(n) = sin(2\\pi f_0n/F_s) , \\ 0 \\leq n \\leq 127 x(n)=sin(2πf0n/Fs), 0≤n≤127 ,
f 0 = 0.4 k H z , F s = 10 k H z f_0 = 0.4kHz , F_s = 10kHz f0=0.4kHz,Fs=10kHz
单位脉冲响应 :
h ( n ) = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 h(n) = \\ 1,2,3,4,5,6,7,8,9,10,11,10,9,8,7,6,5,4,3,2,1 \\ h(n)=1,2,3,4,5,6,7,8,9,10,11,10,9,8,7,6,5,4,3,2,1
上述系统的输出就是 " 输入序列 " 与 " 输出序列 " 的卷积 ;
参考 【数字信号处理】基本序列 ( 正弦序列 | 数字角频率 ω | 模拟角频率 Ω | 数字频率 f | 模拟频率 f0 | 采样频率 Fs | 采样周期 T ) 博客进行理解 ;
f 0 = 0.4 k H z f_0 = 0.4kHz f0=0.4kHz 表示模拟信号频率是 0.4 k H z 0.4kHz 0.4kHz ,
F s = 10 k H z F_s = 10kHz Fs=10kHz 表示数字采样频率是每秒采集 10 k 10k 10k 个样本 , 也就是 10000 10000 10000 个样本 ;
x ( n ) x(n) x(n) 默认是一个无限序列 , 为了方便计算 , 这里为其加了一个区间 0 ≤ n ≤ 127 0 \\leq n \\leq 127 0≤n≤127 ;
数字频率计算 :
数字频率 ( 单位 Hz ) : f = f 0 / F s = 0.4 / 10 = 0.04 f = f_0 / F_s = 0.4 / 10 = 0.04 f=f0/Fs=0.4/10=0.04
matlab 代码示例 :
%清除内存
clear;
%输入序列 , 模拟信号频率 0.4kHz , 采样频率 10kHz
% n 的取值范围是 0 到 127 闭区间整数序列
x=sin(2 * pi * 0.4 * (0:127) / 10);
%单位脉冲响应
%1,2,3,4,5,6,7,8,9,10,11,10,9,8,7,6,5,4,3,2,1
%1 ~ 10 索引的序列就是 1,2,3,4,5,6,7,8,9,10
h(1:10)=(1:10);
%11 索引的序列是 11
h(11)=11;
%12 ~ 21 索引的序列是 10,9,8,7,6,5,4,3,2,1
h(12:21)=(10:-1:1);
%求 " 单位脉冲响应 " 序列的频谱
hf = freqz(h, 1, 1024);
%求 " 输入序列 " 的频谱
xf = freqz(x, 1, 1024);
%求卷积 , 线性时不变系统的输出序列就是 输入序列 与 单位脉冲响应 之间的卷积
y=conv(h,x);
%建立幕布
figure;
%绘制 "输入序列" 图像
plot(x);
%建立幕布
figure;
%绘制 "单位脉冲响应" 图像
plot(h);
%建立幕布
figure;
%绘制 y 函数的值 , 也就是卷积计算结果
plot(y);
% 打开网格
grid on;
输入序列 x ( n ) x(n) x(n) 的函数图像如下 :
单位脉冲响应 h ( n ) h(n) h(n) 函数图像如下 :
输出序列 y ( n ) y(n) y(n) 图像如下 :
以上是关于求matlab中的conv2卷积函数用c++怎么实现的主要内容,如果未能解决你的问题,请参考以下文章