%% 机器学习与数据预测——信号处理
% Machine Learning and Data Prediction -- Signal Processing
%% 1.泰勒级数应用Taylor series application
%% 1.1.diff,int,cumsum函数用法
% 符号函数求导(偏导),求积分(偏积分)
syms x y z m n
f=x^3+y^2+z^2+m^2+n^2;
y1=diff(f,x,1);y2=diff(f,y,2);y3=diff(f,z,3);
y4=int(f,x,1);y5=int(f,y,2);y6=int(f,z,3);
% 匿名函数求导
syms x1 x2 x3
f=@(x1,x2,x3)x1*x2*x3+x2^2+x3^2;
y1=diff(f,x1,1);y2=int(f,x2,2);
% 数组求差分
x1=[1,2,3,4,5,6];y1=diff(x1,1);y2=cumsum(x1);%此时用累加和代替int
% 矩阵:对列向量求差分
A=[1,2,3;4,5,6;7,8,9];y1=diff(A,1);y2=cumsum(A);
%% 1.2.对带有边界的函数求其泰勒展开式
% 符号函数用法:
% taylor(f,x,a,'order',n); %求f关于自变量x在x=a处的泰勒展开式前n项,若a缺省,则默认a=0
syms x1 x2 x3
f=x1^2+x2*x3+x1*x3;
y1=taylor(f,x1,1,'order',4);
y2=taylor(f,[x1,x2,x3],[1,2,1],'order',3);
% 一元数值函数编写:[A,coefficient]=Taylor_series(f,x0,n,xmin,dx,xmax)
% 函数说明:
% 输入量:f为函数信号,为数组;x0为泰勒展开的自变量取值点;n为泰勒级数阶数;
% xmin为自变量取值最小值;xmax为自变量取值最大值,dx为取值间隔。
% 输出量:A为各阶泰勒级数,A第i行代表第i阶泰勒展开式;coefficient为各阶泰勒
% 级数系数,第i项代表第i阶泰勒展开式系数
% 函数注意:
% n值不能过大,5以上效果较优;
% 输入f量不能过大。
n=6;%泰勒级数阶数
x0=0;%求级数的点位置
xmin=-10;xmax=10;dx=1e-4;
x=xmin:dx:xmax;
f=exp(x);
[A,coefficient]=Taylor_series(f,x0,n,xmin,dx,xmax);
%% 2.傅里叶级数与傅里叶变换Fourier series and Fourier transform
%% 2.1.信号基础
%% 2.1.1.对信号实施的基础运算:
a=2;
xmin=-10;xmax=10;dx=1e-4;
x=xmin:dx:xmax;
f=sin(x);
y1=a*f;plot(x,y1);% 数乘
y2=cumsum(f*dx);plot(x,y2);% 积分(不带常数项)
y3=diff(f)/dx;plot(x,y3);% 微分(求导)
t0=1;
x1=x+t0;f=sin(x);plot(x1,f);% 信号右移t0
x0=pi/2;x2=-x+2*x0;f=sin(x);plot(x2,f);% 信号绕点x0翻转
a=3;x3=a*x;plot(x3,f);% 信号缩展,其中a>0,a>1时信号展开;a<1时信号收缩
% 对变换之后的信号进行整理,使自变量从小到大变化
% 对[信号绕点x0翻转]举例:
% 传统方法:
m0=[f;x2];%将函数和自变量放在同一矩阵中,第一行为函数值,第二行为自变量取值
x2=sort(x2);k=zeros(1,length(x2));
for i=1:length(x2)
[~,k0]=find(m0==x2(i));
k(i)=k0;
end
f=f(k);plot(x2,f);
% 利用sort函数改进方法:(在matlab中推荐使用,可节省时间)
[x2,k]=sort(x2);
f=f(k);plot(x2,f);
%% 2.1.2.信号关于x0点处奇偶分解:
xmin=-10;xmax=10;dx=1e-4;x=xmin:dx:xmax;f=exp(x);% 原始信号
x0=0;x2=-x+2*x0;[x2,k]=sort(x2);f0=f(k);% 结合上述方法获得翻转信号
xnew_min=max([x2(1),x(1)]);xnew_max=min([x2(end),x(end)]);% 获得自变量范围
xnew=xnew_min:dx:xnew_max;
% 自变量范围为两信号范围求交集
[~,k1]=find(x>=xnew_min&x<=xnew_max);f1=f(k1);% 获得新自变量范围下原始信号
[~,k2]=find(x2>=xnew_min&x2<=xnew_max);f2=f0(k2);% 获得新自变量范围下原始信号
c0=min([length(f1),length(f2),length(xnew)]);% 简单检验信号长度,防止信号长度
% 不同导致程序无法运行
xnew=xnew(1:c0);
Odd_signal=1/2*(f1(1:c0)-f2(1:c0));% 奇信号
Even_even_signal=1/2*(f1(1:c0)+f2(1:c0));% 偶信号
plot(xnew,Odd_signal);hold on;plot(xnew,Even_even_signal);hold off;
legend('Odd_signal','Even_even_signal');
%% 2.2.傅里叶级数
%% 2.2.1.基础信号特征:
xmin=-10;xmax=10;dx=1e-4;x=xmin:dx:xmax;f=exp(x);% 原始信号
E=sum(f.^2*dx);% 求信号能量
P=E/(xmax-xmin);% 求信号功率
% 连续情况下,能进行傅里叶级数,傅里叶变换的信号需满足:
% 信号有有限个不连续点;有有限个极值点,满足绝对可积
% 一般情况下,所有数值处理的有限信号必满足以上条件
% 采样定理:对连续信号进行采样的频率需大于连续信号最高频率的两倍
%% 2.2.2.三角形式傅里叶级数:
xmin=-10;xmax=10;dx=1e-4;x=xmin:dx:xmax;f=exp(x);% 原始信号
% 将信号分解为三角形式,即:f(x)=a(0)+sum(a(k)*cos(k*w0*t)+b(k)*sin(k*w0*t))
% 编写数值计算函数:function [ak,bk]=Tri_Fourier_series(f,w0,km,xmin,dx,xmax)
% 函数说明:
% 输入量f为信号,w0为f基频,km为求傅里叶级数最大基频倍数,xmin为自变量最小值,
% dx为自变量变化间隔,xmax为自变量最大值,输出[ak,bk]为傅里叶级数系数。
xmin=-10;xmax=10;dx=1e-4;w0=2*pi;x=xmin:dx:xmax;
f=sin(w0*x)+sin(3*w0*x)+5*sin(5*w0*x);% 原始信号
km=10;
[ak,bk]=Tri_Fourier_series(f,w0,km,xmin,dx,xmax);
E=sum(f.^2*dx);% 求信号能量
P=E/(xmax-xmin);% 求信号功率
% 各次谐波含量可表示为:
A0=ak(1)^2/P; % 常数偏置项
A=(bk.^2+ak(2:end).^2)/(2*P); % 各次波分量
A=[A0,A];
%% 2.2.3.傅里叶变换:
% 符号运算
w0=2*pi;syms x w;
f=1/(1/(2*pi/w0)*x+1);
F=fourier(f,x,w);% 对自变量为x的函数f进行傅里叶变换,变换后自变量为w
f1=ifourier(F,w,x);% 对自变量为w的函数F进行傅里叶逆变换,变换后自变量为x
A=abs(f1);fplot(A);
% 数值运算
% 编写函数方法:
% 信号傅里叶变换为:F=int(f*exp(-1i*w*x)*dx)
% 编写数值计算函数:[F,A]=Fourier_transform(f,xmin,dx,xmax,wmin,dw,wmax)
% 函数说明:
% 输入量f为信号,xmin为自变量最小值,dx为自变量变化间隔,xmax为自变量最大值,
% wmin为频域最小值,dw为频域间隔,wmax为频域最大值,输出[F,A]为傅里叶变换后
% 函数与其对应的函数增益
% 注意:利用该函数求解,计算量为:length(wmin:dw:wmax)*length(xmin:dx:xmax)
% 则需要注意计算量不能过大,由于函数为数值求解方法,对于有确定周期函数有可能
% 计算不到周期对应的频率,因此该函数可定性用于对某非信号的频域分析
xmin=-10;% 自变量最小值
xmax=10;% 自变量最大值
dx=1e-3;% 自变量变化间隔
x=xmin:dx:xmax;
w0=2*pi;
f=sin(w0*x)+sin(3*w0*x)+sin(5*w0*x);% 原始信号
wmin=0;% 频域最小值
wmax=10*w0;% 频域最大值
dw=0.1;% 频域变化范围
[F,A]=Fourier_transform(f,xmin,dx,xmax,wmin,dw,wmax);
plot(wmin:dw:wmax,A);
% matlab内置函数:fft(快速傅里叶变换)
xmin=-10;% 自变量最小值
xmax=10;% 自变量最大值
dx=1e-4;% 自变量变化间隔(可视为采样频率)
T=1/dx;% 自变量变换周期(可视为采样周期)
w0=2*pi;
x=xmin:dx:xmax;
L=length(x);% 自变量个数
f=sin(w0*x)+sin(3*w0*x)+5*sin(5*w0*x);% 原始信号
F=fft(f);% 计算信号傅里叶变换
A2=abs(F/L);% 双侧频谱
A1=A2(1:round(L/2)+1);
A1(2:end-1)=2*A1(2:end-1);% 得到单侧频谱
w=dx*(0:round(L/2))/L;
plot(w,A1);
%% 3.拉普拉斯变换与线性系统设计Laplace Transform and Linear system design
%% 3.1.拉普拉斯变换
% 符号运算
w0=2*pi;syms x s;
f=1/(1/(2*pi/w0)*x+1);
L=laplace(f,x,s);% 对自变量为x的函数f进行拉普拉斯变换,变换后自变量为s
f1=ilaplace(L,s,x);% 对自变量为s的函数F进行逆拉普拉斯变换,变换后自变量为x
% 数值运算
% 信号拉普拉斯变换可表示为:F=int(f*exp(-s*x)*dx)
% 确定待求解拉氏变换自变量范围s
pmin=0;dp=1e-2;pmax=5;%实部范围
qmin=0;dq=1e-2;qmax=5;%虚部范围
p=pmin:dp:pmax;q=qmin:dq:qmax;
s=zeros(length(q),length(p));
L=zeros(length(q),length(p));
for i=1:length(p)
s(:,i)=1i*q'+p(i);
end
% 原始信号
xmin=-10;xmax=10;dx=1e-4;w0=2*pi;x=xmin:dx:xmax;
f=sin(w0*x)+sin(3*w0*x)+5*sin(5*w0*x);
% 求解拉氏变换函数
% Laplace_transform=@(f,s,x,dx)sum(f.*exp(-s.*x)*dx);
for i=1:length(p)
tic
for j=1:length(q)
L(j,i)=sum(f.*exp(-s(j,i).*x)*dx);
end
toc
end
LA=abs(L);
%% 3.2.线性系统设计
%% 3.2.1.系统设�
没有合适的资源?快使用搜索试试~ 我知道了~
matlab基础信号处理方法汇总
共10个文件
m:4个
mat:2个
slx:2个
需积分: 0 0 下载量 25 浏览量
2024-03-29
12:36:27
上传
评论
收藏 83KB ZIP 举报
温馨提示
代码汇总并设计了一些matlab基础信号处理方法,供读者学习使用
资源推荐
资源详情
资源评论
收起资源包目录
Signal_processing.zip (10个子文件)
Signal_processing
Tri_Fourier_series.m 805B
Fourier_transform.m 1KB
slprj
sim
varcache
Simple_discrete_linear_timeinvariant_system
checksumOfCache.mat 392B
varInfo.mat 1008B
tmwinternal
simulink_cache.xml 376B
Simple_linear_timeinvariant_system.slx 30KB
html
main_Signal_processing.html 74KB
Taylor_series.m 2KB
main_Signal_processing.m 21KB
Simple_discrete_linear_timeinvariant_system.slx 26KB
共 10 条
- 1
资源评论
loveyoujoyfully
- 粉丝: 674
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功