|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& E4 V* k, Y' Q2 z% Z7 ?文章目录
* \2 {: G, ~* |8 v# s- 离散时间信号——序列的基本运算及matlab实现
- 前言
- 一、什么是离散时间信号?
- 1、离散时间信号
- 2、数字信号处理系统
- 二、序列的基本运算
- 1.序列相加
- 2.序列相乘
- 3、序列倍率
- 4、序列移位
- 5、序列折叠
- 总结
$ J( \2 }$ t! K# u( }/ k$ D # U! k) t5 _0 F c$ }
- T( v: x: [3 U8 b
前言8 q# s/ F& c" }( }% Q3 Z
本篇文章主要介绍数字信号处理内容中的离散信号序列的基本运算,如:序列相加、序列相乘、倍率、移位、折叠、样本和等内容及matlab代码的实现。: W) k0 B; ^: Q
3 @1 B5 O1 |% R: u5 K0 d
提示:以下是本篇文章正文内容,下面MATLAB已亲测有效
d% D+ g/ ?) \
' [& {) \/ ` B一、什么是离散时间信号?- l, W4 L3 e1 C" R
1、离散时间信号! J3 u7 Q: G7 C. V. a
信号可分为模拟信号和数字信号。模拟信号可表示为x(t),表示连续时间,,例如生活中的声音信号。而数字信号可以用x(n)来表示,代表时间的离散时刻,因此也称为离散时间信号,它的表示方法是一个有序的数字序列。
/ v; {/ [6 J! [& j% e: T离散时间信号:时间为离散变量,幅度为连续变化的变量。9 }2 P- A" B% ?# v- w
9 E3 ?" P# y5 I2、数字信号处理系统
7 T# Y4 S# e, ~: C) ?6 K# K数字信号处理系统基本由以下部分组成:前端模拟信号接收装置、抗混叠滤波、A/D转换装置、数字信号处理模块(DSP)、D/A转换装置、平滑滤波组成。
; F& v5 |/ V8 q7 T9 ]; r3 ?! ]5 v: z( U6 H: @
" X! X. r6 l$ H, Y. u
; `9 d& y' Z: e二、序列的基本运算8 q6 P- f- e$ A2 S9 E$ M5 v
1.序列相加' I4 {6 u+ w2 U* t& J; h5 g! m
序列相加是一个对应样本与样本之间的相加。
0 c4 Y5 [8 ?1 _4 ` Y& p1 I. r自定义sigadd函数演示运算:
7 w; ]7 l4 W! Z* ]: f+ s2 x" d! C$ e+ u
function [y,n] = sigadd(x1,n1,x2,n2)+ k L3 w [2 O o8 R; H6 ~+ J
%实现序列相加
; \$ h: U5 s! }- U% 实现y(n)=x1(n)+x2(n)
/ o# N' g, _% m' r* } m- P8 N4 Z% [y,n ]=sigadd(x1 ,n1,x2,n2)0 G) k! U( A' e6 L7 T
n = min(min(n1),min(n2)):max(max(n1),max(n2));$ K; g4 S- Q3 r7 O/ A v- y3 n
y1 = zeros(1,length(n));
& \6 M0 e- C. d" B4 Ry2=y1;
' l' g) Z5 c' b& z! F( ~$ c3 O8 E: `( Z# F
y1 (find( (n>=min (n1) ) & (n<=max (n1) )==1) )=x1 ;
( Q' r. P- k* D5 |6 l% r' Iy2 (find( (n>=min (n2) ) & (n<=max (n2) )==1) )=x2 ;. O! U( n6 ^: f. ^. V) H
h* ~) r1 v" _, t6 _y=y1+y2;6 f! C% e+ p! v
0 n& b N; l4 j- c
end; w* {0 A/ P2 @+ Y; n M- s0 y$ D
: k- }8 b$ J F5 c, k调用该函数5 d5 A9 i2 X. a) s% y
# J; {8 r1 |6 J5 u+ Fn1=[0 1 2 3];' A$ c2 [5 H, u3 h1 G9 j
x1=[1 2 3 4];
) B+ E& ]5 x" w0 g7 d: V
. O$ w8 ^& j" i, N( ]n2=[2 3 4 5];
0 |: N1 T0 G+ jx2=[1 2 3 4];
) V, e( r! h* L% I/ o1 w0 a* g7 R! v0 X
subplot(131); V; B+ u# J' d m. ?, P
stem(n1,x1);
9 n" f9 ?2 d( w: Laxis([-1 5,0 5]); L c! o+ N& r3 o! g
title('x1序列');
! T% Y% ]( \( @: C6 g6 w: v# z4 C% l+ ?# |' P6 b
subplot(132);* W% R% K" f4 Q2 E
stem(n2,x2);/ \: i; @) Z, \' O( q
axis([-1 6,0 5]);2 N! W A5 _6 G5 T" D8 Z
title('x2序列');4 `( ~' u' W% L0 J
& _8 o7 u4 x% S; d& @( K[y,n]=sigadd(x1,n1,x2,n2);
8 f% l c' P6 E2 h2 c7 L- z
& `# l! E" {/ O" `subplot(133);
+ {, @7 o/ K h0 [stem(n,y);
+ `' F0 d( r! ~, }( X3 Y# D! {axis([-1 6,0 8]);& M8 l; n# W" F4 T# i3 [6 I
title('相加后序列');
7 s4 h4 F: e( P0 _! f
0 b$ \$ O: _3 Z( E9 B* [
1 h y% E2 ~# v# \ D+ h结果是正确的
9 H2 R0 z7 e1 k! n) t
; P9 N1 l7 q2 f! J3 n
1 F$ T, @& Y: }# m0 ~9 B
p! Z2 `) j O+ N2.序列相乘/ g" `# I& \" G5 i% Z
序列相乘是对应采样点之间的相乘(点乘)
0 [' ?; J1 Y: V: w3 ~9 X( X0 h9 K T4 C自定义sigmuti函数演示运算:8 m$ U) b2 B* U7 K: O, y
6 }5 S$ ?/ e+ }: ~- i: d9 I
function [y,n] = sigmuti(x1,n1,x2,n2)( b. Z. m, e% }3 ^2 q1 C, r$ L
% 实现y(n)=x1(n)*x2(n); s- p" A6 q# T) w% N
% [y,n ]=sigmuti(x1 ,n1,x2,n2)$ U$ t( O% v0 y+ D% d
n = min(min(n1),min(n2)):max(max(n1),max(n2));
: z# u1 t2 z5 E8 v V% _- ey1 = zeros(1,length(n));" W" F) x4 X2 b# v
y2=y1;
/ i9 [) B9 L7 \3 _! f
9 x: o6 L" y$ X7 s) `% f) Zy1 (find( (n>=min (n1) ) & (n<=max (n1) )==1) )=x1 ;
% n. A, _. ^! d) ry2 (find( (n>=min (n2) ) & (n<=max (n2) )==1) )=x2 ;
* n Z8 W* o v! Q5 B8 g, u3 h$ |8 N; A" b
y=y1.*y2;, ]+ `. y6 T% W
end
0 T$ Y. C9 S) h+ q3 C8 [ P; s: N: U7 e9 X5 S0 R% s# L7 u
' t6 {+ F5 g' N
调用该函数9 s3 e7 h* B4 d1 K$ D
& {6 Q/ W5 Q0 D
n1=[0 1 2 3];
. h& {- Q5 A9 Z/ Z% t. g1 [x1=[1 2 3 4];4 l6 i! K: ?# t# K* w! d. X R
! E* j# h: E" A: K g. Xn2=[2 3 4 5];/ J# W' D: F7 m
x2=[1 2 3 4];2 B% y# p3 t i' ?
z) \# V6 V+ N2 z* G2 t; e
subplot(131);
. g) m& `9 v2 m' hstem(n1,x1);
& x3 s4 A. ?( a5 b% Z) eaxis([-1 5,0 5]);9 q1 h- d6 f3 I: h5 J4 y, _
title('x1序列');3 l! ?3 @$ i! X; m) a
: _3 x+ _( e. G5 r- r zsubplot(132);! c m, p$ o1 d& W/ c
stem(n2,x2);3 s; k$ p8 U* x% J% \: {3 k
axis([-1 6,0 5]);, G+ n, e% M: A# o( ~8 G& a
title('x2序列');
! D3 P& i( D6 z% V+ C4 {" E1 @$ N6 n( r9 _+ q4 B' z( `/ T
[y,n]=sigmuti(x1,n1,x2,n2);/ F- O2 V- d! k
z$ Z: U* d# n8 y2 C* _' J
subplot(133);
* e7 h1 o' R' A- h5 V/ ^& xstem(n,y);$ r* a/ y' @+ X" U9 R3 N
axis([-1 6,0 10]);" Y, S* ?- n+ Z3 p0 }+ W7 o
title('相乘后序列');
% a$ b; `: h8 ?6 }7 [: l* I& m
& H; I, U& ~: }1 p! | h
: t' k" U, t+ q0 `# B# s结果图
- e3 N3 k1 }/ y- |- u' Y7 Y" j0 b& L
9 G, Y3 R8 [" }, s. e4 z
5 n8 Y' Y0 z1 Q: }" D5 J5 s7 s1 m% q8 ^$ v3 k) X; h
0 J( b0 w1 T( ]/ k/ _
3、序列倍率7 k- {8 ]9 a' k+ E$ L" v
这个运算很简单,每一个采样值都乘以倍数a就可以了。
* J1 L2 A/ n7 ^. r5 {% [$ J自定义sigdouble函数演示运算:
5 l( L+ e. c3 x4 C# ^
: E4 c$ u- Q, J" A F; c: \function [y,n] = sigdouble(x1,n1,a), x# K( D9 w& W& N# Y+ s* |! l
%sigdouble 序列倍率- C9 i4 F x4 D$ n% @+ U, W* g
% 在此运算中,
- w) `- D5 D) K) o7 d% ?" x% 每个采样值乘以一个常数a。
* m( W- y2 q# _9 s& B6 n2 X: s# c+ `% a{
. Z+ P: M) O3 i5 D6 K1 ~1 L
, e/ y. n- |! h x(n)}= {9 L- J/ ]8 J8 r7 f- D# R
+ }4 A+ S9 C' c M9 g$ d& e) m& c ax(n)}
/ f5 j5 K. {. @* [, k1 ? w0 l) q, C% 在MATLAB中可用算术运算符“*”来实现倍率运算。! a- i& ^- T2 g, F
n=n1;; P9 y0 c0 m6 J
y=a*x1;% p; D# m0 s+ T; y3 q
end2 E) y6 G; m4 p. o
) x$ V+ h1 {% s9 F i3 R8 u" ]2 `
" N+ L( N* z$ ^! P4 s+ u
调用运行
9 B) B# b$ w( l& q; D
' D* a' b6 ]2 U1 Y2 Y+ I4 z1 Tn1=[0 1 2 3];
5 ?, V. i8 T9 s% M- K1 q( Yx1=[1 2 3 4];* G3 x1 b9 w+ X7 p5 J
a=3; %倍率& _' Q1 a$ z+ {$ j- a
[y,n]=sigdouble(x1,n1,a);8 J2 h& N2 c$ X
subplot(121);; w/ b: L( z U- Q/ q- t6 h7 J* t5 R
stem(n1,x1);
8 |% v& D q, Q6 |+ `$ P7 ^7 laxis([-1 5,0 5]);+ O R( ~. a! F) H. _' Q9 F
title('x1序列');
. L5 @# ~7 ]6 Q' _& k# Z. ?' ~
0 v; J; C& \& i: i& |subplot(122);
( m4 q, z$ M4 Y) Astem(n,y);( C0 H4 ?2 ^% a# M6 r& F+ f
axis([-1 5,0 13]); t4 y& Q2 ?5 T% |5 a& e( E
title('倍率后序列');+ n) u7 o) [( y% c7 p6 {
3 Y6 @' O4 ^$ C) J
* G. U2 B9 H3 d+ d5 l% n* |
结果图* l; @4 q) I+ r ^
( B2 Y- A0 p7 M8 J9 G
' K |7 H( A' [2 c, t0 ]9 H6 z& ?5 L) M4 T. A- S% l
4、序列移位5 B( s9 C1 e. K6 b, K5 X
通过移位运算,每个采样值都向右移动k个单位(k正为右,负为左)。5 x0 b* S/ Q+ e( g6 y
移位后:y(n)={x(n-k)}
8 U4 H Y7 p: l+ T0 ]' P1 y+ \自定义sigfold函数演示运算:! o" |2 I* g2 X6 V. H$ R8 x4 |
$ K0 C* O& f& Z6 F6 S Y x
3 P% @( w. y% P6 W! y- l; k+ `! f
function [y,n] = sigshift(x,m,n0), F& o- U# H/ u' e$ ?
%实现y(n)=x(n-n0)6 z. N) O2 _/ n5 y
%移位--在此运算中,x (n)的每一个样本都移动n0个周期,移位后的序列y (n)如下。
; n; p+ n9 P* e' G1 a
@) J% j0 C1 c5 X1 N0 gn=m+n0;5 V6 s' W# y' [2 B, y+ G g! B8 i
y=x;- j& i4 U+ p: [) H
$ x; p8 E* `8 N
+ L B5 ?! F, V s, [4 |
end+ {& E; P2 I$ f1 N4 ^7 [
5 q) k6 R5 X, u$ G
3 \2 z, @) l- n; {& @+ {( ]0 A调用运行:
4 @) g, e6 [, v/ R. A
1 K! _0 v. d+ g1 @9 cn1=[0 1 2 3];/ [; |/ m4 |# W$ x1 k( X
x1=[1 2 3 4];6 L; ^4 I9 i0 f2 p. N& z5 D; n0 [
a=-3; %向左平移3个单位2 k8 r k2 N3 O n5 E7 a8 k
[y,n]=sigshift(x1,n1,a);5 U. U8 v$ V! q9 l" C v1 I
subplot(121);
- M. j) p; K$ @5 k3 U1 Astem(n1,x1);7 ?1 b# u# F) R" Q3 a0 m
axis([-4 4,0 5]);# B( S6 S2 G8 I) F1 `' k
title('x1序列');
" _7 z- k% s; _. _! Y3 Q h- T" a g
! a. z! R8 |0 T! K" X, Xsubplot(122);
7 |3 K# b. o3 X5 o1 J1 Bstem(n,y);
4 v0 _* ]$ s2 T" a, \: M! naxis([-4 4,0 5]);
c+ G" N/ f* W: e; I0 h: ftitle('移位后序列');" g1 _* P6 W) @& T
/ Z7 t: W: g5 D& @
; i K& \( C: @- A/ |, U) o
结果图:
( t3 [* A& C7 @/ M! C' L
7 y0 W' {- m, Z$ P
g/ ]3 [+ i7 e/ i D% i v5 R. z( ^
- i4 r" a, y7 Z* h! K; h/ K
1 s" W& Z4 q- ^+ f& I! f9 o/ ^" B5、序列折叠
& [6 ^! R$ m: E) Y4 |: d通过折叠运算,使得采样值每个样本按照n=0翻转
5 u% U# y2 u8 s# q, `自定义sigfold函数演示运行:
- n3 s2 t$ ?3 r, Q( G* Y5 M0 Z. U2 |% |" D7 e( O# a) ?
function [y,n] = sigfold(x,n0)5 H, Y7 d9 S# I6 a. s! u
%序列折叠运算/ p" }0 {$ q1 v9 m" D
%在此运算中,x (n)的每个样本都对n= o翻转,得到一个折叠后的序列y(n)4 A' a6 N4 W7 x% Q& S8 v
%y(n)={" Q7 i V/ [$ |9 q% n3 @/ ^
' n6 g G* U0 J2 a( Y: h
x(-n)}
) G% `- l) j3 M; D3 ]y=fliplr(x);# S1 ]6 ]0 ?4 [# S) O w, @
n=-max(n0):-min(n0);
6 B" F7 F D2 X( V5 V
9 O1 ]6 @/ L9 ~end* V- x2 }( B. l0 |0 Z+ z
/ P- [. d0 Y6 r) H. Y8 ?# O& C" _6 U
V$ r' v' Z! N1 ]" E" c# q; W# J" P调用运行:. S5 L k6 [& ^, g9 P
7 k5 I3 o2 |+ g+ g: Wn1=[0 1 2 3];
& s1 f/ T3 _& H% F- V- lx1=[1 2 3 4];
8 T3 S4 R3 f# T& C% L[y,n]=sigfold(x1,n1);% v4 z, z$ Y- W9 K5 N
subplot(121);$ A8 b9 O* G0 j0 X7 M. l
stem(n1,x1);
/ q) }, v2 B+ E' Y. Laxis([-4 4,0 5]);' G$ {5 L, Q' t# ?8 Z0 U
title('x1序列');7 V$ ^0 c- x/ N& q
4 v# m2 E: O4 E1 M
subplot(122);
- e: A7 Z, j+ Ostem(n,y);
+ h2 f; z" Z8 Y1 ?7 E: w' ]/ s yaxis([-4 4,0 5]);
: h% Z( j# o, m6 Btitle('折叠后序列');8 j" v9 h- Q$ u: W
1 n9 e6 m; n; N$ x; G6 h8 P3 o. [# T; t+ q' A" {' S* n/ a
* O- Z) G g- o( \结果图:3 | Y; }, I/ p+ ?/ m
" j% z' k" r0 |7 Y# |
5 W% H: M$ V2 W3 P& C
$ S0 [' c9 e1 \& ^1 z$ ^! z
# s" }# y8 }: d0 S- n2 F
总结- a& \5 ~9 C- q6 V
至此,序列的基本运算就介绍完了。往后我会持续更新信号处理的其他内容,欢迎志同道合的同仁批评指正,一起探讨经验。
5 C/ W! E c) p8 s3 n7 c |
|