DSP using MATLAB中的函数学习

为了解决matlab自带的函数conv中没有时间的信息,所以改写了conv_m以达到保留序列的时间(顺序)的目的

function [y,ny] = conv_m(x,nx,h,nh)

% Modified convolution routine for signal processing
% -------------------------------------------------
% [y,ny] = conv_m(x,nx,h,nh)
%  y = convolution result
% ny = support of y
%  x = first signal on support nx
% nx = support of x
%  h = second signal on support nh
% nh = support of h
%
nyb = nx(1)+nh(1); nye = nx(length(x)) + nh(length(h));


ny = [nyb:nye];


y = conv(x,h);

这段代码中我认为比较经典的是在

nyb = nx(1)+nh(1); nye = nx( length(x) + nh(length(h)) );

这一句中通过length求得长度,这样就相当于在没有序列输入的时候将值置位0,在最后不显示

或者说是允许在输入序列的时候序列的标号长度与序列值的长度不同。




这一段代码是傅里叶系数的获取

function [Xk] = dfs(xn,N)

% Computes Discrete Fourier Series Coefficients
% ---------------------------------------------
% [Xk] = dfs(xn,N)
% Xk = DFS coeff(系数的意思啦). array over 0 <= k <= N-1
% xn = One period of periodic signal over 0 <= n <= N-1
%  N = Fundamental period of xn
%


n = [0:1:N-1];                       % row vector for n


k = [0:1:N-1];                       % row vecor for k


WN = exp(-j*2*pi/N);                 % Wn factor


nk = n'*k;                           % creates a N by N matrix of nk values


WNnk = WN .^ nk;                     % DFS matrix


Xk = xn * WNnk;                      % row vector for DFS coefficients

这里就摘抄一下书上的原话吧


”进行傅里叶级数“系数,为了计算每一个样本X~(k),能够作为一个for...end 循环的和来实现;为了计算所有的DFS系数就需要另一个for...end循环,这就会得到一种嵌套两个for...end循环的实现。在MATLAB中,这显然效率很低的。MATLAB的一种高效实现是采用矩阵向量乘法;在实现离散时间傅丽叶变换的数值近似中,早先已用过这一办法。

这里指的就是上面程序中的WNnk的获得啦。

还有就是MATLAB毕竟是矩阵实验室,所以对矩阵还是比较感兴趣,对循环,那是C++的事情啦。



下面是对系统的差分方程输出的求解过程。主要是通过LTI的线性时不变性拆分成零输入和零状态。

clear all;close all; 

num=[2 -1 0]; %系统函数分子的系数
den=[2 -1 -3]; %系统函数分母的系数
n=0:50; 
nl=length(n); 
%求零输入响应
y01=[1 3]; %y的初始状态
x01=[0 0]; %x 的初始状态
x1=zeros(1,nl); 
zi1=filtic(num,den,y01,x01); 
%为filter函数准备初始值
y1=filter(num,den,x1,zi1); 

 
%求零输入响应
subplot(311); 
stem(n,y1,'r.'); 
title('零输入响应'); 
grid on; 
%求零状态响应
y02=[0 0]; 
x02=[0 0]; 
x2=0.5.^n; 
zi2=filtic(num,den,y02,x02); 
y2=filter(num,den,x2,zi2); 
subplot(312); 
stem(n,y2,'r.');  

上面是百度文库的一段例子,感觉可以很好的完成差分方程的求解啦。

这里主要注意的是filtic的运用。因为以前看到的都是直接用filter

它山之石

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MatlabDSP函数是用于数字信号处理的函数。这些函数可以用于设计、分析和实现数字滤波器、频谱分析、信号合成等操作。一些常用的DSP函数包括: 1. tf2zp:将传递函数转换为零极点增益表示。使用该函数可以将传递函数表示的系统转换为零极点增益的形式。 2. zp2tf:将零极点增益表示转换为传递函数。该函数可以将零极点增益表示的系统转换回传递函数的形式。 3. freqs:计算模拟滤波器的频率响应。该函数可以根据系数向量计算返回模拟滤波器的复频域响应。 4. residue或residuez:使用部分分式法计算系统的频率响应。这些函数可以将系统的传递函数表示为一组部分分式,并计算每个分式的系数。 以上是一些常用的DSP函数,它们可以帮助我们在Matlab进行数字信号处理的各种操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *2* *3* [MatlabDSP的系统函数的表示法及其转换](https://blog.csdn.net/ReCclay/article/details/84671002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *4* [MatlabDSP应用的freqs函数](https://blog.csdn.net/ReCclay/article/details/84667528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值