zoukankan      html  css  js  c++  java
  • DSP实验_时域中的离散时间信号

    一、时域中的离散时间信号:

    1,  序列的产生

    在Matlab中,可以用一个具有适当值的行向量来表示一个有限长序列。准确的表示x[n]需要有两个向量,分别表示x和n。例如序列:

    n = [-3,-2,-1,0,1,2,3,4];x = [2,1,-1,0,1,4,3,7];

    当样本的位置信息不要求、或不重要时(如序列在n=0开始时),可只用x向量表示。由于有限的存储空间限制,一个任意无限长序列不能用Matlab表示。

    1)单位样本序列:

    在Matlab中,函数zeros(1,N)产生一个具有N个零的行向量,利用它可以实现在一个有限区间上的不过,逻辑关系式n==0也是实现 的一种好方法。

    产生长度为N的单位样本序列:

    u = [1 zeros(1,N-1)];

    产生延时M个样本且长度为N的单位样本序列(M<N):

    ud = [zeros(1,M) 1 zeros(1,N-M-1)];

      或,在区间 上实现 (平移n_0个样本的单位样本序列)可使用如下函数:

    function [x,n] = impseq(n0,n1,n2)
    % Generates x(n) = delta(n-n0); n1 <= n <= n2
    % ----------------------------------------------
    n = [n1:n2];

    x = [(n-n0) == 0];

     

    例:产生并绘制一个单位样本序列

    % Generation of a Unit Sample Sequence

    clf;         %清空

    % Generate a vector from -10 to 20       %产生一个从-10到20的向量

    n = -10:20;

    % Generate the unit sample sequence 产生单位样本序列

    u = [zeros(1,10) 1 zeros(1,20)];

    % Plot the unit sample sequence       %绘制图像

    stem(n,u);            % stem(X,Y) 在 X 指定的值的位置绘制数据序列 Y。X 和 Y 输入必须是大小相同的向量或矩阵。另外,X 可以是行或列向量,Y 必须是包含 length(X) 行的矩阵。

    xlabel('Time index n');ylabel('Amplitude');

    title('Unit Sample Sequence');

    axis([-10 20 0 1.2]);

     

    注意:

    (1)clear、close、clc、clf的用法

    clear  Clear variables and functions from memory. 清除工作空间的所有变量

             close  Close figure. 关闭当前的figure窗口

             clc    Clear command window.  清空命令行窗口

             clf     Clear current figure.  清除当前的figure窗口

    (2)type和edit的区别:

    Type   List program file.

    Edit   Edit or create a file.

    (3)单行注释:%

             多行注释:%{ 和 %}必须各自在的一单独行才行。例如:

    %{

    This next block of code checks the

    ……

    processing the data.

    %}

    (2)单位阶跃序列:

    产生长度为N的单位阶跃序列:

    S = [ones(1,N)];

    或:

    function [x,n] = stepseq(n0,n1,n2)
    % Generates x(n) = u(n-n0); n1 <= n <= n2
    % ------------------------------------------
    n = [n1:n2]; x = [(n-n0) >= 0];

    (3)指数序列:

    Matlab中的exp函数可用来产生指数序列。如n = [0:10]; x = (0.9).^n;产生实指数序列,而n = [0:10]; x = exp((2+3j)*n);产生复指数序列。

     

    例:产生一个复指数信号。

    % Generation of a complex exponential sequence

    clf;

    c = -(1/12)+(pi/6)*i;

    K = 2;

    n = 0:40;

    x = K*exp(c*n);

    subplot(2,1,1);     % subplot(m,n,p) 将当前图窗划分为 m×n 网格,并在 p 指定的位置创建坐标区。MATLAB® 按行号对子图位置进行编号。第一个子图是第一行的第一列,第二个子图是第一行的第二列,依此类推。如果指定的位置已存在坐标区,则此命令会将该坐标区设为当前坐标区。

    stem(n,real(x));    %real()返回数组的实部

    xlabel('Time index n');ylabel('Amplitude');

    title('Real part');

    subplot(2,1,2);

    stem(n,imag(x));    %返回数组的虚部

    xlabel('Time index n');ylabel('Amplitude');

    title('Imaginary part');

    例:产生一个实指数信号。

    % Generation of a real exponential sequence

    clf;

    n = 0:35; a = 1.2; K = 0.2;

    x = K*a.^n;

    stem(n,x);

    xlabel('Time index n');ylabel('Amplitude');

    (4)正弦序列:

    Matlab中的cos或sin函数可用于产生正弦序列,如n = [0:10]; x = 3*cos(0.1*pi*n+pi/3) + 2*sin(0.5*pi*n);

    例:产生一个实正弦信号。

    % Generation of a sinusoidal sequence

    n = 0:40; 

    f = 0.1;                      

    phase = 0;                         

    A = 1.5;                    

    arg = 2*pi*f*n - phase;

    x = A*cos(arg);

    clf;                     % Clear old graph

    stem(n,x);                 % Plot the generated sequence

    axis([0 40 -2 2]);

    grid;

    title('Sinusoidal Sequence');

    xlabel('Time index n');

    ylabel('Amplitude');

    axis;

    注意:连续时间信号与离散时间信号中“频率”的概念:

    对于连续时间正弦信号

    A1,对于每一个固定的频率值F,x(t)是周期的。

    A2,具有不同频率的连续时间正弦信号是可以区分的。

    A3,增大频率F会导致信号振荡速率增大,也即在给定的时间间隔内包含更多的周期。

    对于离散时间正弦信号

    B1,一个离散时间正弦信号当且仅当其频率f是有理数(两个整数的比值)时才是周期的。由于f=r/N,可以看出,较小的频率改变会导致周期的较大改变。例如,f1=31/60意味着N1=60,而f2=30/60导致N2=2。

    B2,频率相差2π整数倍的离散时间正弦相同。

    B3,当 时离散时间正弦的振荡速率最大。通常选择  

    称为基本范围(fundamental range)。

    (5)随机信号:

    产生一个长度为N的、在区间(0,1)中均匀分布的随机信号:

    x = rand(1,N);

    产生一个长度为N且具有零均值和单位方差的正态分布的随机信号:

    x = randn(1,N);

    (6)周期信号:

    要从一个长度为N的序列x[n]产生P个周期,可将x[n]重复P次:

    xtilde=[x,x,…,x];

    或者,先产生包含x[n]值的P行矩阵,然后利用“:”将P行连成一个长的行向量。

    x=rand(1,10);

    xtilde = x' * ones(1,3)

    xtilde = xtilde(:);   % long column vector A(:) 将 A 中的所有元素重构成一个列向量。如果 A 已经是列向量,则此表达式没有任何作用。

    xtilde = xtilde';

    1,  序列的运算

    (1)信号相加

    如果两个序列长度不同,或者长度相同但采样位置不同,则不能直接相加。

    function [y,n] = sigadd(x1,n1,x2,n2)
    % implements y(n) = x1(n)+x2(n)
    % -----------------------------
    % y = sum sequence over n, which includes n1 and n2 (n上的求和序列,包括n1和n2)
    % x1 = first sequence over n1    (n1上的第一个序列)
    % x2 = second sequence over n2 (n2 can be different from n1)  (n2上的第二个序列(n2可以不同于n1))
    %
    n = min(min(n1),min(n2)):max(max(n1),max(n2)); % duration of y(n)  (yn的持续时间)
    y1 = zeros(1,length(n)); y2 = y1; % initialization
    y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; % x1 with duration of y (持续时间为y的x1)
    y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; % x2 with duration of y (持续时间为y的x2)
    y = y1+y2; % sequence addition

    (2)信号相乘(乘积)

    function [y,n] = sigmult(x1,n1,x2,n2)
    % implements y(n) = x1(n)*x2(n)
    % -----------------------------
    % y = product sequence over n, which includes n1 and n2
    % x1 = first sequence over n1
    % x2 = second sequence over n2 (n2 can be different from n1)

    n = min(min(n1),min(n2)):max(max(n1),max(n2)); % duration of y(n)
    y1 = zeros(1,length(n)); y2 = y1; %
    y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; % x1 with duration of y
    y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; % x2 with duration of y
    y = y1 .* y2; % sequence multiplication

    (3)移位/时移

    将x[n]中的每一个样本都位移k得到y[n]=x[n-k],若令m=n-k,那么n=m+k,上述运算变为y[m+k]=x[m],所以这个运算对向量x没有影响,但向量n的每个元素都要改变即加k。

    function [y,n] = sigshift(x,m,k)
    % implements y(n) = x(n-k)
    % -------------------------
    n = m+k; y = x;

    (4)反转

    将x[n]中的每个样本都以n=0为中心翻转得到一个反转序列y[n]。在Matlab中,该运算对序列的样本值用函数filplr(x)实现,对样本位置用函数-fliplr(n)来实现:

    function [y,n] = sigfold(x,n)
    % implements y(n) = x(-n)
    % -----------------------
    y = fliplr(x); n = -fliplr(n);

    (5)信号能量

    在Matlab中,有限长序列x[n]的能量计算如下:

    Ex = sum(x .* conj(x)); % one approach 一种方法
    Ex = sum(abs(x) .^ 2); % another approach 另一种方法

    注:上角标*代表复数共轭运算。在DSP中,符号*表示许多运算,通过其字体和位置来区分。

    练习题:

    1,产生复值序列 ,并分别画出它的幅度、相位、实部和虚部。

    clc
    clear
    %表示 
    n = [-10:10];
    alpha = -0.1 + 0.3j;
    x = exp(alpha*n);
     %绘制实部
    subplot(2,2,1);
    stem(n,real(x),'filled');
    title('real part');
    xlabel('n');
    ylim([-3,1.5]);
     %绘制虚部
    subplot(2,2,2);
    stem(n,imag(x),'filled');
    title('imaginary part');
    xlabel('n');
     %绘制幅值
    subplot(2,2,3);
    stem(n,abs(x),'filled');
    title('magnitude part');
    xlabel('n');
     %绘制相位
    subplot(2,2,4);
    stem(n,(180/pi)*angle(x),'filled');
    title('phase part');
    xlabel('n');

  • 相关阅读:
    Combine 框架,从0到1 —— 4.在 Combine 中使用计时器
    Combine 框架,从0到1 —— 4.在 Combine 中使用通知
    Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度
    Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布
    使用 Swift Package Manager 集成依赖库
    iOS 高效灵活地配置可复用视图组件的主题
    构建个人博客网站(基于Python Flask)
    Swift dynamic关键字
    Swift @objcMembers
    仅用递归函数操作逆序一个栈(Swift 4)
  • 原文地址:https://www.cnblogs.com/vzyk/p/11660231.html
Copyright © 2011-2022 走看看