matlab app 录音信号AM调幅时频域分析

AM调幅波时域图像除幅值平移外无变化,频谱图为0。

img

img

myRecording=getaudiodata(app.recorder);
            L0= length(myRecording);
            t = (0:L0-1)/app.fs;
%             assignin('base','t',t);
            x=myRecording;
%             assignin('base','x',x);
            x_am=(2+x).*cos(2*pi*8000*t);
            plot(app.UIAxes4,t,x);
            plot(app.UIAxes,t,x_am);
            title(app.UIAxes,'调幅信号时域图像');
            xlabel(app.UIAxes,'t(s)'), ylabel(app.UIAxes,'幅度')
            L1=length(x);
            y1=abs(fft(x)/L1);
            f1=app.fs*(0:(L1/2))/L1;
            plot(app.UIAxes3, f1,y1(1:L1/2+1)); %绘制频域图像
%             xlim(app.UIAxes3,[4000,12000]);
            L=length(x_am);
%             NFFT = 2^nextpow2(L); %确定 FFT 变换的长度
%             y = fft(x_am, NFFT)/L;
%             f = app.fs/2*linspace(0,1,NFFT/2+1); %频率向量
%             plot(app.UIAxes2, f,2*abs(y(1:NFFT/2+1))); %绘制频域图像
            y=abs(fft(x_am)/L);
            L0=length(y);
            f=app.fs*(0:(L0/2))/L;
            plot(app.UIAxes2, f,y(1:L/2+1)); %绘制频域图像
            title(app.UIAxes2,'调幅信号频域图像');
            xlim(app.UIAxes2,[4000,12000]);
%             ylim(app.UIAxes2,[-0.0005,0.001]);
            xlabel(app.UIAxes2,'f(Hz)'), ylabel(app.UIAxes2,'幅度');


经试验调试发现,频域调幅信号没有波形的原因是xlim范围选择不准确,且由于频域调幅信号部分峰值(1.5左右)特别大,导致有用信号频段不是很明显(0.01),就像在高楼面前放了一颗树,请改用axis()函数同时限制横轴纵轴范围:

axis([2000, 4000, 0, 0.01]);

而时域AM图像怀疑可能是app.UIAxes选择的名称不对,在.m测试脚本中注释掉带有app.X的地方是可以有效果的。

clc,clear,close all;
[myRecording,fs] = audioread('chirp.wav');
%load data

L0= length(myRecording);
t = (0:L0-1)/fs;
%             assignin('base','t',t);
x=myRecording;
%             assignin('base','x',x);
x_am=(2+x).*cos(2*pi*8000*t);
subplot(221)
plot(t,x);
% plot(app.UIAxes4,t,x);
subplot(222)
plot(t,x_am);
title('调幅信号时域图像');
xlabel('t(s)'), ylabel('幅度')
% xlabel('t(s)'), ylabel(app.UIAxes,'幅度')
% plot(app.UIAxes,t,x_am);
% title(app.UIAxes,'调幅信号时域图像');
% xlabel(app.UIAxes,'t(s)'), ylabel(app.UIAxes,'幅度')
L1=length(x);
y1=abs(fft(x)/L1);
f1=fs*(0:(L1/2))/L1;
% f1=app.fs*(0:(L1/2))/L1;
subplot(223)
plot(f1,y1(1:L1/2+1)); %绘制频域图像
% plot(app.UIAxes3, f1,y1(1:L1/2+1)); %绘制频域图像
%             xlim(app.UIAxes3,[4000,12000]);
L=length(x_am);
%             NFFT = 2^nextpow2(L); %确定 FFT 变换的长度
%             y = fft(x_am, NFFT)/L;
%             f = app.fs/2*linspace(0,1,NFFT/2+1); %频率向量
%             plot(app.UIAxes2, f,2*abs(y(1:NFFT/2+1))); %绘制频域图像
y=abs(fft(x_am)/L);
L0=length(y);
f=fs*(0:(L0/2))/L;
% f=app.fs*(0:(L0/2))/L;
subplot(224)
plot(f,y(1:L/2+1)); %绘制频域图像
title('调幅信号频域图像');
axis([2000, 4000, 0, 0.01]);
xlabel('f(Hz)'), ylabel('幅度');
% save('data.mat', 'x_am')
% plot(app.UIAxes2, f,y(1:L/2+1)); %绘制频域图像
% title(app.UIAxes2,'调幅信号频域图像');
% xlim(app.UIAxes2,[4000,12000]);  %范围有误,不能仅设置xlim
%             ylim(app.UIAxes2,[2000, 4000, 0, 0.01]);
% xlabel(app.UIAxes2,'f(Hz)'), ylabel(app.UIAxes2,'幅度');

img

我选用的是一段chirp啁啾信号,所以出图效果和你的有些差别。

将输入信号更换为正弦波AM调制更为明显:

clc,clear,close all;
% [myRecording,fs] = audioread('chirp.wav');
% load data
fs = 200;
n = -2:1/fs:2;
myRecording = sin(2*pi*500/fs*n);

L0= length(myRecording);
t = (0:L0-1)/fs;
%             assignin('base','t',t);
x=myRecording;
%             assignin('base','x',x);
x_am=(2+x).*cos(2*pi*4000/fs*t);
subplot(221)
plot(n,x);
% plot(app.UIAxes4,t,x);
subplot(222)
plot(t,x_am);
title('调幅信号时域图像');
xlabel('t(s)'), ylabel('幅度')
% xlabel('t(s)'), ylabel(app.UIAxes,'幅度')
% plot(app.UIAxes,t,x_am);
% title(app.UIAxes,'调幅信号时域图像');
% xlabel(app.UIAxes,'t(s)'), ylabel(app.UIAxes,'幅度')
L1=length(x);
y1=abs(fft(x)/L1);
f1=fs*(0:(L1/2))/L1;
% f1=app.fs*(0:(L1/2))/L1;
subplot(223)
plot(f1,y1(1:L1/2+1)); %绘制频域图像
% plot(app.UIAxes3, f1,y1(1:L1/2+1)); %绘制频域图像
%             xlim(app.UIAxes3,[4000,12000]);
L=length(x_am);
%             NFFT = 2^nextpow2(L); %确定 FFT 变换的长度
%             y = fft(x_am, NFFT)/L;
%             f = app.fs/2*linspace(0,1,NFFT/2+1); %频率向量
%             plot(app.UIAxes2, f,2*abs(y(1:NFFT/2+1))); %绘制频域图像
y=abs(fft(x_am)/L);
L0=length(y);
f=fs*(0:(L0/2))/L;
% f=app.fs*(0:(L0/2))/L;
subplot(224)
plot(y(1:L/2+1)); %绘制频域图像
title('调幅信号频域图像');
% axis([2000, 4000, 0, 0.01]);
xlabel('f(Hz)'), ylabel('幅度');
% save('data.mat', 'x_am')
% plot(app.UIAxes2, f,y(1:L/2+1)); %绘制频域图像
% title(app.UIAxes2,'调幅信号频域图像');
% xlim(app.UIAxes2,[4000,12000]);
%             ylim(app.UIAxes2,[2000, 4000, 0, 0.01]);
% xlabel(app.UIAxes2,'f(Hz)'), ylabel(app.UIAxes2,'幅度');

img

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7539638
  • 这篇博客也不错, 你可以看下Matlab的程序在,m文件中运行不了,在命令窗口却可以正常运行的问题元元已找到?
  • 除此之外, 这篇博客: 基于matlab实现双路音频信号的AM调制与解调中的 二、滤波器的设置 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 可以在命令行输入fdatool打开,也可以从下面的方法进入。
    进入matlab,选择APP,注意这里的路径需要为matlab安装目录下的bin文件夹,不然有可能报错。
    在这里插入图片描述
    在APP下拉菜单里面找到“信号处理与通信”里面的“Filter Designer”,点击打开
    在这里插入图片描述
    打开后在如下图所示的界面中第一栏可以选择滤波器类型(低通、高通、带通等)以及滤波方法(巴特沃斯、切比雪夫、椭圆等),每种滤波方法特性不一样。第二栏指定滤波的阶数,可以指定也可以采用系统给出的最小阶数。第三栏设置采样频率和截止频率。第四栏一般不管。
    如下图设置为低通、切比雪夫二型、15阶、采样48000Hz、截止12000Hz的滤波器,选定参数后,点击最下方的Design Filter可以显示当前滤波器的特性曲线,点击上方状态栏的不同图标可以更换去向类型。
    在这里插入图片描述
    将滤波器导出为函数,点击左上角File按钮,如下图选择,即可导出.m格式的Function文件,保存到同一文件夹下,就可以进行调用。使用filter函数调用,示例如下:

    z1=filter(Chebyshev_two_high_15_100000_30000,z); %30kHz为界,分开两路信号
    

    在这里插入图片描述


  • 您还可以看一下 硬核野生技术咨询客服小李老师的matlab零基础入门故障检测人脸识别等专题研究课程中的 变量类型小节, 巩固相关知识点

基于new bing部分指引作答:
根据你提供的代码,我注意到你在绘制频谱图时遇到了问题。为了修正这个问题,你可以使用以下代码进行修改:

myRecording = getaudiodata(app.recorder);
L0 = length(myRecording);
t = (0:L0-1)/app.fs;

x = myRecording;
x_am = (2 + x) .* cos(2*pi*8000*t);

plot(app.UIAxes4, t, x);
title(app.UIAxes4, '原始信号时域图像');
xlabel(app.UIAxes4, 't (s)');
ylabel(app.UIAxes4, '幅度');

plot(app.UIAxes, t, x_am);
title(app.UIAxes, '调幅信号时域图像');
xlabel(app.UIAxes, 't (s)');
ylabel(app.UIAxes, '幅度');

L1 = length(x);
y1 = abs(fft(x) / L1);
f1 = app.fs * (0:(L1/2))/L1;
plot(app.UIAxes3, f1, y1(1:L1/2+1));
title(app.UIAxes3, '原始信号频域图像');
xlabel(app.UIAxes3, 'f (Hz)');
ylabel(app.UIAxes3, '幅度');

L = length(x_am);
y = abs(fft(x_am) / L);
f = app.fs * (0:(L/2))/L;
plot(app.UIAxes2, f, y(1:L/2+1));
title(app.UIAxes2, '调幅信号频域图像');
xlabel(app.UIAxes2, 'f (Hz)');
ylabel(app.UIAxes2, '幅度');

这些修改将绘制原始信号和调幅信号的时域图像,并绘制它们的频谱图像。注意,代码中已经添加了标题和坐标轴标签以提高图像的可读性。确保调整图形对象的名称,以便与你的应用程序中的对象匹配。