• MATLAB的一些应用--最近用的比较多


    MATLAB的一些应用--最近用的比较多

    1、MATLAB分析信号的频谱

    快速Fourier变换(FFT)是离散傅里叶变换的快速算法,他是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。

    针对几个个简单例子介绍一下:

    (1、)假设数据采集频率为1000Hz,一个信号包含频率为50Hz、振幅为0.7的正弦波和频率为120Hz、振幅为1的正弦波,噪声为零平均值的随机噪声

    FFT方法分析其频谱方法Matlab程序如下:

    clear
    Fs = 1000;                    % 采样频率
    T = 1/Fs;                     % 采样时间
    L = 1000;                     % 信号长度
    t = (0:L-1)*T;                % 时间向量
    x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
    y = x + 2*randn(size(t));     % 加噪声正弦信号
    figure(1)
    plot(Fs*t(1:50),y(1:50))
    title('零平均值噪音信号');
    xlabel('time (milliseconds)')
    NFFT = 2^nextpow2(L); % Next power of 2 from length of y
    Y = fft(y,NFFT)/L;
    f = Fs/2*linspace(0,1,NFFT/2);
    figure(2)
    plot(f,2*abs(Y(1:NFFT/2)))
    title('y(t)单边振幅频谱')
    xlabel('Frequency (Hz)')
    ylabel('|Y(f)|')

    结果如下:

    (2)产生余弦信号以作频谱分析:余弦信号y=cos(2π*f*t);信号频率为f=10Hz;时宽:1s   采样率为fs=100Hz;

    MATLAB程序:

    clear all;
    f=10;
    fs=100;
    T=1;
    n=round(T*fs);%采样点个数
    t=linspace(0,T,n);
    y=cos(2*pi*f/fs*[0:n-1]);
    figure(1)
    plot(t,y);
    title('余弦信号时域');
    xlabel('t/s');
    ylabel('幅度');
    %用fft函数对产生的余弦信号作频谱分析:
    %注意:该步骤得到的是0~fs内的频谱。
    fft_y=fft(y);
    f=linspace(0,fs,n);
    figure(2)
    plot(f,abs(fft_y));
    title('余弦信号频谱(fft)');
    xlabel('f/Hz');
    ylabel('幅度');
    % 用fftshift函数得到-fs/2~fs/2内的频谱:
    fftshift_y=fftshift(fft_y);
    f=linspace(-fs/2,fs/2,n);
    figure(3)
    plot(f,abs(fftshift_y));
    title('余弦信号频谱FFTshift');
    xlabel('f/Hz');
    ylabel('幅度');

    结果:

    可以看到10Hz处有峰值,90Hz的峰值是-10Hz的峰值向右频谱搬移fs=100Hz得到的。

    由于实信号频谱幅度关于原点对称,可以看到10Hz与-10Hz处的两个峰值。

    2、MATLAB中几种采样方法及实现

    X(t)的时域信号

    syms x;

    >> f=sym('cos(2/3*pi*x)');

    >> ezplot(f,[0,40]);

                      

    采样信号及频域波形

    w=-pi:0.01*pi:pi;
    
    n=0:40;
    
    x=cos(2/3*pi*n);
    
    X=x*exp(-j*n'*w);
    
    subplot(211);
    
    stem(n,x,'filled');
    
    xlabel('n');
    
    title('x[n]');
    
    subplot(212);
    
    plot(w/pi,X);

    过采样:

    w=-pi:0.01*pi:pi;
    
    n=0:40;
    
    x=cos(2/3*pi*n);
    
    X=x*exp(-j*n'*w);
    
    subplot(311);
    
    stem(n,x,'filled');
    
    xlabel('n');
    
    title('x[n]');
    
    subplot(312);
    
    plot(w/pi,abs(X));
    
    xlabel('Omega/pi');
    
    title('Magnitude of X');
    
    subplot(313);
    
    plot(w/pi,angle(X));
    
    xlabel('Omega/pi');
    
    title('Phase of X');

    临界采样:

    w=-pi:0.01*pi:pi;
    
    n=0:1.5:40;
    
    x=cos(2/3*pi*n);
    
    X=x*exp(-j*n'*w);
    
    subplot(311);
    
    stem(n,x,'filled');
    
    xlabel('n');
    
    title('x[n]');
    
    subplot(312);
    
    plot(w/pi,abs(X));
    
    xlabel('Omega/pi');
    
    title('Magnitude of X');
    
    subplot(313);
    
    plot(w/pi,angle(X));
    
    xlabel('Omega/pi');
    
    title('Phase of X');

    欠采样:

    w=-pi:0.01*pi:pi;
    
    n=0:3:40;
    
    x=cos(2/3*pi*n);
    
    X=x*exp(-j*n'*w);
    
    subplot(311);
    
    stem(n,x,'filled');
    
    xlabel('n');
    
    title('x[n]');
    
    subplot(312);
    
    plot(w/pi,abs(X));
    
    xlabel('Omega/pi');
    
    title('Magnitude of X');
    
    subplot(313);
    
    plot(w/pi,angle(X));
    
    xlabel('Omega/pi');
    
    title('Phase of X');

    信号重构--临界采样

    n=-100:100;
    
     t=-30:0.005:30;
    
     wc=2;
    
     Ts=pi/wc;
    
     ws=2*pi/Ts;
    
     m=n*Ts;
    
     f=sinc(m/pi);
    
     ft=f*Ts*wc*sinc((wc/pi)*(ones(length(m),1)*t-m'*ones(1,length(t))))./pi;
    
     t1=-9*pi:Ts:9*pi;
    
     f1=sinc(t1/pi);
    
     subplot(311);
    
     stem(t1,f1,'filled');
    
     xlabel('kTs');
    
     ylabel('kTs');
    
     title('临界采样信号');
    
     subplot(312);
    
     plot(t,ft);
    
     title('临界采样信号重构信号');
    
     xlabel('t');
    
     ylabel('f(t)');
    
     subplot(313);
    
     plot(t,ft-sinc(t/pi));
    
     title('重构信号与原信号误差');
    
     xlabel('t');

    信号重构--欠采样

    n=-100:100;
    
      t=-30:0.005:30;
    
      wc=0.5;
    
      Ts=pi/wc;
    
      ws=2*pi/Ts;
    
      m=n*Ts;
    
      f=sinc(m/pi);
    
      ft=f*Ts*wc*sinc((wc/pi)*(ones(length(m),1)*t-m'*ones(1,length(t))))./pi;
    
      t1=-9*pi:Ts:9*pi;
    
      f1=sinc(t1/pi);
    
      subplot(311);
    
      stem(t1,f1,'filled');
    
      xlabel('kTs');
    
      ylabel('kTs');
    
      title('欠采样信号');
    
      subplot(312);
    
      plot(t,ft);
    
      xlabel('t');
    
      ylabel('f(t)');
    
      title('欠采样信号重构信号');
    
      subplot(313);
    
      plot(t,ft-sinc(t/pi));
    
      title('重构信号与原信号误差');
    
      xlabel('t');

    信号重构--过采样

    n=-100:100;
    
      t=-30:0.005:30;
    
      wc=4;
    
      Ts=pi/wc;
    
      ws=2*pi/Ts;
    
      m=n*Ts;
    
      f=sinc(m/pi);
    
      ft=f*Ts*wc*sinc((wc/pi)*(ones(length(m),1)*t-m'*ones(1,length(t))))./pi;
    
      t1=-9*pi:Ts:9*pi;
    
      f1=sinc(t1/pi);
    
      subplot(311);
    
      stem(t1,f1,'filled');
    
      xlabel('kTs');
    
      ylabel('kTs');
    
      title('过采样信号');
    
      subplot(312);
    
      plot(t,ft);
    
      xlabel('t');
    
      ylabel('f(t)');
    
      title('过采样信号重构信号');
    
      subplot(313);
    
      plot(t,ft-sinc(t/pi));
    
      title('重构信号与原信号误差');
    
      xlabel('t');

  • 相关阅读:
    【LeetCode】731. 图像渲染
    【LeetCode】130. 被围绕的区域
    小白之HTTP协议熟悉篇
    Java和js常用表达式
    Mysql主主复制高可用解决方案
    解决vue报错:Module build failed (from ./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js): TypeError: Cannot read property 'range' of null
    centos7使用yum安装jdk并配置jdkhome
    阿里nacos安装及使用指南
    js实现给html固定区域增加水印
    MySQL安装教程
  • 原文地址:https://www.cnblogs.com/lxt1105/p/6741937.html
Copyright © 2020-2023  润新知