【使用matlab绘制音频数据的时域图和频域图】

使用matlab绘制音频数据的时域图和频域图

虚拟的数据集见附件

一、读取数据并设置参数

matlab 复制代码
close all;clear all;colordef black
设置参数
filedir = 'D:\Projects\MATLAB\data'
name = '2024-03-28.txt'
% disp(filedir);

Fs = 8192; %采样率,即单位时间的样本个数(Hz),应该是1s内8192个样本
WINDOWS = 8192*1; %分帧帧大小,每一帧所包含的样本数
OVERLAP = 0;      %分帧重叠

读取音频数据
orgdata = load(strcat(filedir,'\',name)); % 声呐原始数据

rawdata = orgdata(1:Fs*60*1,2); % 选择第2列前1分钟内的音频数据
datalen = length(rawdata); %数据长度
time = 0:1/Fs/60:(datalen-1)/Fs/60; % 时域图横坐标:时间【0,13min】,步长1/Fs/60代表每分钟一个样本

二、绘制时域图

matlab 复制代码
二维时域图
figure
set(gcf,'units','normalized','pos',[0 0 1 1]); % 最大化图形
plot(time,rawdata)
set(gca,'Fontsize',10); %字体大小10points
title('二维时域图');
xlabel('时间/min');ylabel('Amplitude'); %(时间,振幅)     

三、绘制频域图

频谱图1

先进行傅里叶变换,将时域数据转化为频域数据,例如:

matlab 复制代码
快速傅里叶变换
fftValue = abs(fftshift(fft(rawdata))); %快速傅里叶变换:将时域转化为频域

全部数据:

matlab 复制代码
频谱图1:全部数据
figure % 频谱图1
set(gcf,'units','normalized','pos',[0 0 1 1]); % 最大化图形

Amp1 = (fftValue)/datalen;  % 纵坐标:实际幅值(每个幅度值除以datalen归一化)
f1 = (1:datalen)*Fs/datalen;  % 横坐标:生成对称频率坐标(数组索引必须是正整数或者逻辑值)

plot(f1,Amp1);    
xlim([0 8192]);%限制横坐标
ylim([0 0.006]);%限制横坐标
set(gca,'Fontsize',10);
title('频谱图1 全部');
xlabel('频率/HZ');ylabel('Amplitude');

频谱图2

取左一半图:

matlab 复制代码
频谱图2 左一半
figure %频谱图3 左一半
set(gcf,'units','normalized','pos',[0 0 1 1]); % 最大化图形

Amp3 = (fftValue(1:datalen/2))/datalen/2;  % 频谱图纵坐标:实际幅值(取一半的数据点,每个幅度值除以datalen/2归一化)
f3 = (1:datalen/2)*Fs/datalen;  % 频谱图横坐标:生成一个从0到采样频率一半的对称频率坐标

plot(f3,Amp3);    
xlim([0 8192]);%限制横坐标
ylim([0 0.006]);%限制横坐标
set(gca,'Fontsize',10);
title('频谱图2 左一半 [0,1/2L]');
xlabel('频率/HZ');ylabel('Amplitude');

频谱图3

取右一半图:

matlab 复制代码
频谱图3 右一半
figure %频谱图2.5 右一半
set(gcf,'units','normalized','pos',[0 0 1 1]); % 最大化图形

Amp25 = (fftValue(datalen/2:datalen-1))/datalen/2;  % 频谱图纵坐标:实际幅值(取一半的数据点,每个幅度值除以datalen/2归一化)
f25 = (datalen/2:datalen-1)*Fs/datalen;  % 频谱图横坐标:生成一个从0到采样频率一半的对称频率坐标

plot(f25,Amp25);    
xlim([0 8192]);%限制横坐标
ylim([0 0.006]);%限制横坐标
set(gca,'Fontsize',10);
title('频谱图3 右一半 [1/2L,L]');
xlabel('频率/HZ');ylabel('Amplitude');

频谱图4

将右边一半图左移,使得横坐标从0开始

matlab 复制代码
%% 频谱图4:右一半左移
figure %频谱图4 右一半左移
set(gcf,'units','normalized','pos',[0 0 1 1]); % 最大化图形

Amp2 = (fftValue(datalen/2:datalen-1))/datalen/2;  % 频谱图纵坐标:实际幅值(取一半的数据点,每个幅度值除以datalen/2归一化)
f2 = (datalen/2:datalen-1)*Fs/datalen - Fs/2;  % 频谱图横坐标:生成一个对称频率坐标,-Fs/2代表横坐标从0到采样频率一半

plot(f2,Amp2);    
xlim([0 8192]);%限制横坐标
ylim([0 0.006]);%限制横坐标
set(gca,'Fontsize',10);
title('频谱图4 右一半 [0,1/2L]');
xlabel('频率/HZ');ylabel('Amplitude');

ps: 在绘制频域图时需要限制合适的横纵坐标范围,便于数据显示。

复制代码
xlim([0 8192]);%限制横坐标
ylim([0 0.006]);%限制横坐标
相关推荐
不知名的老吴几秒前
C++ 中函数对象的形式概述
开发语言·c++
Shan120510 分钟前
C++中函数对象之重载 operator()
开发语言·c++·算法
playmaker9014 分钟前
音频转mid、midi文件
音视频
HelloWorld1024!19 分钟前
c++核心之万字详解 * 和 & 所有用法(指针、引用、取地址、解引用、常量修饰)
开发语言
Legendary_00825 分钟前
解析 PD Sink 与 LDR6500U:Type-C 取电的核心密码
c语言·开发语言
冴羽yayujs32 分钟前
JavaScript 9 个先有库再有 API 的故事
开发语言·javascript·ecmascript
回忆2012初秋34 分钟前
.NET 8.0 实战:基于 MQTTnet 封装高可用的 MQTT 发布/订阅工具类
开发语言·mqtt·.net
Evand J41 分钟前
【课题推荐】三模型IMM交互式多模型滤波算法,匀速/左转/右转目标跟踪,附MATLAB代码测试结果
算法·matlab·目标跟踪·无人机·imm·多模型
油丶酸萝卜别吃1 小时前
JavaScript 深度合并函数 deepMerge 实现指南(附完整测试用例)
开发语言·javascript·测试用例
EasyDSS1 小时前
私有化音视频系统/企业级融媒体平台EasyDSS优化升级让视频会议协作更高效
音视频·媒体