MATLAB使用循环绘制时频图

最近在做一次实验中,对采集到的数据进行分析处理。分别对采集到的信号进行了小波去噪和小波去噪之后在加带通滤波,但是想绘制三段信号的时域波形图和频谱图,如果一幅图绘制一次,就显得工作量重复很大,所以想想能不能设计一个循环来一次性输出我想要的图像,经过好几天的探索,终于搞定了,对大佬老说可能就分分钟,对一个小白来说确实花费了很多的精力,这也是本人第一次发博客。

本人现在研一新生,有好多东西可以说都是刚刚起步,所以想借助这个平台来一点点记录下自己的研究生生活,包括学习中遇到的一些问题啥的都会在此做下简单的记录,希望大家多提一下宝贵的意见,共同交流学习进步!

%%
[Original_music,Sample_Fs]=audioread('E:\研究生实验\test_music\phone_music.mp3');
file_1 = 'E:\研究生实验\实验数据\test6\music_1_30us.xlsx';
data_1 = xlsread(file_1);
data_1 = data_1(:,2);
%Excel文件中每一列的数据代表一个传感器采集到的数据,这里我选取了一个传感器进行分析

%% 设计高通滤波器 
Wp=5;%通带截止频率
Ws=0.8;%阻带截止频率
Ap=1;%通带最大衰耗
As=40; %阻带最小衰耗
fs = 1/(30e-6);
Wpp = Wp/(fs/2);   %归一化;
Wss = Ws/(fs/2);   %归一化;
% 求得阶数和3db截频wc
[N,Wc]=buttord(Wpp,Wss,Ap,As); %Computer the order of analog filter,s表示模拟
[b,a] = butter(N,Wc,'high'); %Compute AF coefficients
data_1 = filter(b,a,data_1);
data_1 = data_1(108849:500000,:);
%{
    由于我采用的笔记本电脑作为上位机采集的实验数据,上位机软件有滤波功能,但是
我的电脑太OUT了,运算量挺不过来,所以我就直接保存了原始数据,然后自己在电脑中进
行滤波处理,至于如何滤波,自己可以去网上搜索相关代码,也可以用MATLAB自带的工具
箱,个人感觉MATLAB自带的工具箱挺好用的,还能对滤波器直接进行可视化,方便我们能
对其中的参数做相应的调整
    采集到的数据一般不会是你刚好想要的,假如一段3秒钟的音乐,你从监测开始,不可
能监测3秒就停止了吧,万一没采上呢,所以说一般采集到的数据肯定会包含你想要的,同
时还有一些其他的数据,所以需要从所有数据中把你需要的提取出来,这个是有相关算法的,
因为我就是做个普通的小实验,所以我就肉眼观察直接截取了部分数据,没有用一些什么算
法之类的,如果是需要发论文的实验数据,千万不能这么草率,那肯定直接寄了
%}

%%
data_2 = data_11;              
data_3 = data_12; 
%我直接下载的mp3格式文件,导入到MATLAB中默认的采样率就是这个,当然,也可以自己修改采样率
Sample_Fs1 = 1/(30e-6);
%实验中的采样频率,这个一定要设置好,否则后续的分析全部是错误的
x_sum = cell(1,3);
x_sum = {data_1,data_2,data_3};
%{
data_1表示的采集到的是滤波后原始信号,data_2表示的是小波去噪之后的图像,data_3
表示的是小波去噪加低通滤波之后的信号,这里我是想用一个循环将三个信号的时域图和
频谱图给同时画出来,如果一个一个画的画,代码重复量太大了
%}

%% 这是绘制的原始信号的时域图和频谱图,为啥单独画,因为采样率不一样
figure(1);
Original_N = length(Original_music);
Original_t = (0:Original_N-1)/Sample_Fs;
subplot(4,2,1);
plot(Original_t,Original_music,'b');
xlabel('Time/s');ylabel('Amplitude');title('原始信号时域图');
grid on;
subplot(4,2,2);
Y_y = fft(Original_music);
P2_y = abs(Y_y/Original_N);
P1_y = P2_y(1:Original_N/2+1);
P1_y(2:end-1) = 2*P1_y(2:end-1);
f_y = Sample_Fs*(0:(Original_N/2))/Original_N;
plot(f_y,P1_y);
xlabel('f/HZ');ylabel('Amplitude');title('原始信号频谱图');
% axis([0,5000,0,inf]);
grid on;

%% 利用循环绘制处理后三种信号的时域图和频谱图
for k = 1:3
    N = length(x_sum{k});
    t = (0:N-1)/Sample_Fs1;
    subplot(4,2,2*k+1);
    plot(t,x_sum{k},'g');
    xlabel('Time/s');ylabel('Amplitude');
    if k==1
        title('采集信号时域图');
    elseif k==2
        title('小波去噪信号时域图');
    elseif k==3
        title('小波带通滤波信号时域图');
    else
    end
    grid on;
    subplot(4,2,2*k+2);
    Y = fft(x_sum{k});
    P2 = abs(Y/N);
    P1 = P2(1:N/2+1);
    P1(2:end-1) = 2*P1(2:end-1);
    f = Sample_Fs1*(0:(N/2))/N;
    plot(f,P1);
    xlabel('f/HZ');ylabel('Amplitude');
    if k==1
        title('采集信号频谱图');
    elseif k==2
        title('小波去噪信号频谱图');
    elseif k==3
        title('小波带通滤波信号频谱图');
    else
    end
    grid on;
end
%{
    循环中,你想把哪幅图片放置于哪个位置,如果在一张画布里面,只需要自己调节
subplot中的相关参数就可以了,第一次也不知道怎么调节,后来就是自己慢慢试的,调整
好了之后发现也没有那么难,自己拿笔稍微一推算就出来了;如果需要在不同的画布中画
图,同样新建画布,调整相关参数就可以了。
%}

%% 将数据保存为Wav文件和将数据写入Excel中
% audiowrite('E:\研究生实验\实验数据\test5\name.wav',data_3,Sample_Fs1);
% xlswrite('E:\研究生实验\实验数据\test5\wav_high.xlsx',data_3);

下面是我的输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值