首页 > 其他分享 >Matlab-对wav音频文件AM调制及解调

Matlab-对wav音频文件AM调制及解调

时间:2023-07-02 23:58:07浏览次数:50  
标签:sound fs signal fft AM 音频文件 points Matlab data

1.读取wav音乐文件

% 读取音频文件
filename = 'jay.wav';
[sound_data, fs] = audioread(filename);  % 9507502x2 44100
sound_data_1 =  sound_data(:, 1);
sound_data_1 = sound_data_1';             % 转置

sound_data有两列,因为此音乐文件有两个通道,音频采样率为44100;

这里只使用其中一个通道数据;

将多行数据转置为单行数据,方便后续调制

2.调制

% 调制参数
carrier_freq = 1000;    % 载波频率
modulation_index = 0.5; % 调制指数
dc = 1;                 % 直流偏置

% 创建载波信号
t = (0:length(sound_data_1)-1) / fs;
carrier = cos(2*pi*carrier_freq*t);

% 进行AM调制
sound_data_1 = dc + modulation_index*sound_data_1;  %直流偏置,乘以调制指数在偏置    
modulated_signal = sound_data_1 .* carrier;

关于一些参数:

调制指数:也叫调制深度,定义为调制信号振幅与载波振幅之间的比例。调制指数决定了调制信号对载波振幅的影响程度。

直流偏置:AM调制时需要将基带信号往上搬移的幅值,保证信号所有采样点都在正轴

3.包络检波解调

%%%%%%%%%%%%%%1.使用接口解调,包络检波%%%%%%%%%%%%%
% % 解调恢复原始信号
% demodulated_signal = amdemod(modulated_signal, carrier_freq, fs, 0, modulation_index);
% % 播放解调后的音频
%sound(demodulated_signal, fs);

%%%%%%%%%%%%%%2.希尔伯特变换的包络检波%%%%%%%%%%%%%
% demodulated_signal = abs(hilbert(modulated_signal));
% sound(demodulated_signal, fs);

%%%%%%%%%%%%%%3.接口的包络检波,等于希尔伯特%%%%%%%%%%%%%
% [upper_signal, lower_signal] = envelope(modulated_signal);
% sound(upper_signal, fs);  % fs为采样率
% subplot(2, 1, 1);
% plot(sound_data_1);
% subplot(2, 1, 2);
% plot(upper_signal);

4.相干解调

%%%%%%%%%%%%%%4.相干解调%%%%%%%%%%%%%
demodulated_signal = modulated_signal .* carrier;
% 设计低通滤波器
[b, a] = butter(6, carrier_freq/(fs/2)); % 设计6阶低通滤波器
% 低通滤波
filtered = filter(b, a, demodulated_signal); 
subplot(2, 1, 1);
plot(sound_data_1);
subplot(2, 1, 2);
plot(filtered);
sound(filtered, fs);  % fs为采样率

 5.FFT分析

%%%%%%%%%%%%%%%%%%%绘图%%%%%%%%%%%%%%%%%%
% fft点数
fft_points = length(sound_data_1);
%%%%%%%%%%%%%%画原始信号的fft%%%%%%%%%%%%%
subplot(4, 1, 1);
x1 = fs*(0:(fft_points-1))/fft_points;
y1 = abs(fft(sound_data(:, 1), fft_points));
plot(x1, y1);                             
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('FFT Spectrum');

%%%%%%%%%%%%%%画加了偏置原始信号的fft%%%%%%%%%%%%%
subplot(4, 1, 2);
x2 = fs*(0:(fft_points-1))/fft_points;
y2 = abs(fft(sound_data_1, fft_points));
plot(x2, y2);                             
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('FFT Spectrum');

%%%%%%%%%%%%%画am调制信号的fft%%%%%%%%%%%%%
subplot(4, 1, 3);
x3 = fs*(0:(fft_points-1))/fft_points;
y3 = abs(fft(modulated_signal, fft_points));
plot(x3, y3);                             
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('FFT Spectrum');

%%%%%%%%%%%%%画解调调制信号的fft%%%%%%%%%%%%%
subplot(4, 1, 4);
x4 = fs*(0:(fft_points-1))/fft_points;
y4 = abs(fft(demodulated_signal, fft_points));
plot(x4, y4);                            
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('FFT Spectrum');

 

 

6.完整代码

% AM调制

% 读取音频文件
filename = 'jay.wav';
[sound_data, fs] = audioread(filename);  % 9507502x2 44100
sound_data_1 =  sound_data(:, 1);
sound_data_1 = sound_data_1';             % 转置
% 调制参数
carrier_freq = 1000;  % 载波频率
modulation_index = 1; % 调制指数
dc = 1;               % 直流偏置

% 创建载波信号
t = (0:length(sound_data_1)-1) / fs;
carrier = cos(2*pi*carrier_freq*t);

% 进行AM调制
sound_data_1 = dc + modulation_index*sound_data_1;  %直流偏置,乘以调制指数在偏置    
modulated_signal = sound_data_1 .* carrier;



%%%%%%%%%%%%%%1.使用接口解调,包络检波%%%%%%%%%%%%%
% % 解调恢复原始信号
% demodulated_signal = amdemod(modulated_signal, carrier_freq, fs, 0, modulation_index);
% % 播放解调后的音频
%sound(demodulated_signal, fs);

%%%%%%%%%%%%%%2.希尔伯特变换的包络检波%%%%%%%%%%%%%
% demodulated_signal = abs(hilbert(modulated_signal));
% sound(demodulated_signal, fs);

%%%%%%%%%%%%%%3.接口的包络检波,等于希尔伯特%%%%%%%%%%%%%
% [upper_signal, lower_signal] = envelope(modulated_signal);
% sound(upper_signal, fs);  % fs为采样率
% subplot(2, 1, 1);
% plot(sound_data_1);
% subplot(2, 1, 2);
% plot(upper_signal);

%%%%%%%%%%%%%%4.相干解调%%%%%%%%%%%%%
demodulated_signal = modulated_signal .* carrier;
% 设计低通滤波器
[b, a] = butter(6, carrier_freq/(fs/2)); % 设计6阶低通滤波器
% 低通滤波
filtered = filter(b, a, demodulated_signal); 
subplot(2, 1, 1);
plot(sound_data_1);
subplot(2, 1, 2);
plot(filtered);
sound(filtered, fs);  % fs为采样率



% %%%%%%%%%%%%%%%%%%%绘图%%%%%%%%%%%%%%%%%%
% % fft点数
% fft_points = length(sound_data_1);
% %%%%%%%%%%%%%%画原始信号的fft%%%%%%%%%%%%%
% subplot(4, 1, 1);
% x1 = fs*(0:(fft_points-1))/fft_points;
% y1 = abs(fft(sound_data(:, 1), fft_points));
% plot(x1, y1);                             
% xlabel('Frequency (Hz)');
% ylabel('Magnitude');
% title('FFT Spectrum');
% 
% %%%%%%%%%%%%%%画加了偏置原始信号的fft%%%%%%%%%%%%%
% subplot(4, 1, 2);
% x2 = fs*(0:(fft_points-1))/fft_points;
% y2 = abs(fft(sound_data_1, fft_points));
% plot(x2, y2);                             
% xlabel('Frequency (Hz)');
% ylabel('Magnitude');
% title('FFT Spectrum');
% 
% %%%%%%%%%%%%%画am调制信号的fft%%%%%%%%%%%%%
% subplot(4, 1, 3);
% x3 = fs*(0:(fft_points-1))/fft_points;
% y3 = abs(fft(modulated_signal, fft_points));
% plot(x3, y3);                             
% xlabel('Frequency (Hz)');
% ylabel('Magnitude');
% title('FFT Spectrum');
% 
% %%%%%%%%%%%%%画解调调制信号的fft%%%%%%%%%%%%%
% subplot(4, 1, 4);
% x4 = fs*(0:(fft_points-1))/fft_points;
% y4 = abs(fft(demodulated_signal, fft_points));
% plot(x4, y4);                            
% xlabel('Frequency (Hz)');
% ylabel('Magnitude');
% title('FFT Spectrum');

 

标签:sound,fs,signal,fft,AM,音频文件,points,Matlab,data
From: https://www.cnblogs.com/judes/p/17521702.html

相关文章

  • Matlab对wav文件做fft分析
    1.代码%指定要读取的.wav文件路径filename='jay.wav';%使用audioread函数读取.wav文件[sound_data,sample_rate]=audioread(filename);sound_data=sound_data(:,1);%计算音频数据的长度sound_length=length(sound_data);%计算FFT的点数%fft_points=......
  • x64 架构,也称作AMD64或Intel 64,是指一种64位的处理器架构,是对x86架构的扩展和升级。x6
    x64架构,也称作AMD64或Intel64,是指一种64位的处理器架构,是对x86架构的扩展和升级。x64架构支持更大的内存寻址范围和更高的性能,适用于运行64位操作系统和应用程序。x64架构最早由AMD引入,并在2003年取得了广泛的市场认可。随后,Intel也推出了兼容x64架构的处理器。目前,绝大多数......
  • 2022年AMC8数学竞赛题目及考点分析
     2022年AMC8数学竞赛题目及考点分析!1.选择题答题技巧❶ 特定值法➤ 当几何图形不是唯一确定时,可以假设某些特殊条件(例如某个特殊角度或者某条边长),然后再进行计算;➤ 题目中要求最大值或者最小值时,从最极端的情况开始考虑,此时往往假设变量中的一个取到其最值;➤......
  • CF842E Nikita and game 题解
    题意一棵树初始只有一个编号为1的根结点。\(n\)次操作,每次新增一个点作为\(p_i\)的子结点,询问更新后有多少点可以作为树直径的端点。\(n\le3\times10^5\)。题解以下\(dist(x,y)\)表示点\(x\)与点\(y\)在树上的距离。不难发现若干条直径必然叠合于至少一点,任选这......
  • 从头学Java17-Stream API(一)
    StreamAPIStreamAPI是按照map/filter/reduce方法处理内存中数据的最佳工具。本系列中的教程包含从基本概念一直到collector设计和并行流。在流上添加中继操作将一个流map为另一个流map流是使用函数转换其元素。此转换可能会更改该流处理的元素的类型,但您也可以在不更改......
  • centos-9stream安装zabbix-all
    centos-9stream安装zabbix-all下载Zabbix1.zabbix是一个基于web界面的提供分布式系统监控以及网络监控功能的企业级开源解决方案。zabbix能监控各种网络参数,保证服务器系统的安全运行,并且能够提供灵活的通知报警机制让系统管理员能快速的发现问题,定位问题,解决问题.2.zabbix除了支持......
  • 使用Spring的NamedParameterJdbcTemplate完成DAO操作
    NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干,NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。publicObjectqueryForObject(Stringsql,MapparamMap,RowMapperrowMapper)......
  • 用Wpf做一个Block编程画板(续5-Diagram画板,仿Scratch)
    用Wpf做一个Block编程画板(续5-Diagram画板)先上一张效果动图,本次更新主要仿照Scratch,目前仅完成拖拽部分,逻辑部分后续完善。同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram本次扩展主要内容:1.Block模块,入口在文件新建下。2.简易Block的使用:......
  • matlab将3个向量变为相互正交
    zhengshu=x(1:4,1:1000)futou1=x(1:4,1001)futou2=x(1:4,1002)futou3=x(1:4,1003)futou1=futou1/sqrt(sum(futou1.*futou1));fu12=futou1'*futou2futou1mo=sqrt(sum(futou1.*futou1));fu12=fu12/futou1mofutou2=futou2-fu12*futou1futou2=futou2/sqrt(sum(futou2.*futou2......
  • [WPF]静态资源(StaticResource)和动态资源(DynamicResource)
    一、文章概述本演示介绍了WPF的静态资源和动态资源的基本使用,并对两者做了简单的比较。静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了;动态资源(DynamicResource)使用指的是在程序运行过程中然会去访问资源。相关下载(代码、屏幕录像):h......