写在前面

最近一直在用matlab在所信号处理算法的仿真工作,这一系列博客主要会分详一下遇到的一些问题及解决办法,和一些常用的功能模块的实现以及分分享。

一、正弦信号生成

一段正弦信号,主要设计这些参数的设置:

  • 采样率:理论上来说要满足奈奎斯特采样频率,但是在实际使用中,一般都选择更高倍数,防止信号失真
  • 采样时间:决定信号长度or点数
  • 信号形式:单频or多频叠加,原理

二、matlab实现

2.1 生成单频正弦信号

按照上节所说的内容,进行代码的编写就好了

%生成单频正弦信号
function [signal] = Any_freq_signal(fs , t, f ,Amp,phase)%采样率,时间,频率,幅值,相位(deg)
    dt = 1/fs;
    N = t*fs;
    t = 0:dt:(N-1)*dt;
    signal = Amp*sin(2*pi*f*t+phase/180*pi);
end

上面代码部分可生成特定频率和长度的单频正弦信号,但是在实际情况下吗,信号并不是理想的,因此通常会加入不同信噪比的噪声来进行对比测试,这里可以在以后的内容中展开介绍,

2.2 生成多频正弦信号

当我们想要的信号是多个频率的正弦叠加时,最简单的方法当然是利用循环把每个正弦信号叠加起来,但是这种方法耗时较多,可以考虑用矩阵的方式实现。

%生成多频正弦信号
function [signal] = Mult_freq_signal(fs , t, f ,Amp,phase)%采样率,时间,频率,幅值,相位(deg)
    dt = 1/fs;
    N = t*fs;
    t = (0:dt:(N-1)*dt)';
    signal = Amp*sin(2*pi*f.*t+phase/180*pi);
    Num = size(f,2)
    signal = signal*ones(Num,1);
end
2.3 对上述信号进行频域分析

信号分析段中最常用的就是傅里叶变换了,以上述两个函数为例,使用傅里叶变换验证正确性。
对于单频

%单频信号频谱分析
clc;clear;close all;

y = Any_freq_signal(1e6,0.001,10e3,2,45);

function [signal] = Any_freq_signal(fs , t, f ,Amp,phase)%采样率,时间,频率,幅值,相位(deg)
    dt = 1/fs;
    N = t*fs;
    t = 0:dt:(N-1)*dt;
    signal = Amp*sin(2*pi*f*t+phase/180*pi);
    figure
    subplot(121);
    plot(t/dt,signal);
    title('信号时域');
    xlabel('点数 N');ylabel('幅值 A');
    Y = fftshift(fft(signal));
    F = (-N/2:N/2-1)*(fs/N);
    subplot(122);
    plot(F,abs(Y));
    title('信号频域');
    xlabel('频率 f');ylabel('幅值 A')

end

运行结果如图:
单频信号时域频域
对于多频

clc;clear;close all;

f = 1e3:1e3:5e3;%频率矩阵(1*N)
phase = 10:10:50;
Amp = [1.1,1.3,1.1,1.2,0.8];
yy = Mult_freq_signal(1e7,0.01,f,Amp,phase);


function [signal] = Mult_freq_signal(fs , t, f ,Amp,phase)%采样率,时间,频率,幅值,相位(deg),频率数量
    dt = 1/fs;
    N = t*fs;
    t = (0:dt:(N-1)*dt)';
    y = Amp.*sin(2*pi*f.*t+phase/180*pi);
    Num = size(f,2)
    signal = y*ones(Num,1);
    figure
    subplot(121);
    plot(t/dt,signal);
    title('信号时域');
    xlabel('点数 N');ylabel('幅值 A');
    Y = fftshift(fft(signal));%做傅里叶变换并把零频点移到频谱中心
    F = (-N/2:N/2-1)*(fs/N);%设置横坐标
    subplot(122);
    plot(F,abs(Y)/max(abs(Y)));
    title('信号频域');
    xlabel('频率 f');ylabel('幅值 A')
end

结果如图
在这里插入图片描述
傅里叶变换结果的分叉,是由于频谱分辨力不足导致的,可以提高采样点数来避免。

以上就是本次的全部内容了,如果有什么问题欢迎私信或评论交流!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐