这是Gay电的一个大作业。(懂的都懂)
有人未经我同意给了代码(好歹我也查了一个钟头资料,又整合了两个钟头吧,既然如此那总不能造福几个人吧,都给出去了,那就大家一起学习咯),索性直接面向全网。(当然,这段代码其实也是借鉴了许多人的,索性给院友们当做参考批判的matlab_Coding了)。
作业要求在上边咯
其他博主也有关于类似的。我也是参考了那几位的。不过,在这里我会以保姆级别去解读这段代码。
clc
clear all;
%%
%此部分是先读取音频,与采样频率的设置
%下边的''--是文件路径和文件名
[y,Fs] = audioread('D:\FFOutput\Xu嵩_New4.wav');
fprintf('默认抽样频率为: %d\n',Fs);
n=length(y) ;
%
T=1/Fs; %采样周期
t=(1:n)*T; %采样时间
%
y1=fft(y); %做FFT变换
f=(0:n-1).*Fs/n;
figure()
subplot(211)
plot(f,y1) %画出原始信号的频谱图
title('原始信号频谱图')
xlabel('频率Hz');
ylabel('频率幅值');
subplot(212)
plot(t,y);
title('原始信号时域分析')
%下面加噪声
Noise=0.1*randn(n,2);
y_Noise=y+Noise;
y_zp=fft(y_Noise,n); %对n点进行傅里叶变换到频域
f2=Fs*(0:n/2-1)/n; % 对应点的频率
figure(2);
plot(f2,abs(y_zp(1:n/2))); %加噪语音信号的频谱图
title('加噪语音信号频谱图');
xlabel('频率Hz');
ylabel('频率幅值');
%接下来仿真时域波形
t1=length(y_Noise);
t2=(1:t1)*T;
figure(3)
plot(t2,y_Noise);
title('加噪语音信号时域分析')
xlabel('时间t/s');
ylabel('音量');
%接下来
% sound(y_Noise) %这个是测试噪声出来的操作
Quick_Fs=2*Fs
%第三小问
R1=audiorecorder ;
%快放
sound(y,2*Fs);
record(R1);
% sound(y,2*Fs);
pause(20)
Recording5 = getaudiodata(R1);
sound(Recording5)
% start_time = 0.5;
% end_time = 20.5; %设置开始结束时间
% Y_new=y((Fs*start_time+1):Fs*end_time,1); %截取新音频
% audiowrite('D:\FFOutput\Xu嵩_New4.wav',Y_new,2*Fs); %写入新音频
%慢放
R2 = audiorecorder ;
sound(y,0.5*Fs);
record(R2);
pause(20);
Recording6 = getaudiodata(R2);
sound(Recording6)
这是他开源给他好朋友的代码。并不是我最终的。但是,几乎和我的一样了。我不过交上去的是一份把注释删去了一点,又加上了两三条指令的东西而已。但我会以一个研究者初学者的角度去解读这段代码的功能(毕竟我也是个刚学matlab不是很久的fw级别人才,要是我足够强估摸就把大作业各类课题全做出来了唉)
首先clc是清屏命令行的意思。
比如说这个,
命令行窗口出现了错误,看起来这些指令很烦是吧
此时我还没按回车键
现在我按了
清爽了
这个叫做工作区,存储运行出来变量值显示给操作者看的地方 clear all的意思就是把这些存储区里边的东西删掉
现在工作区就没了,删掉了(下图)
这个操作有什么用呢?他便于你进行另一个程序运行的时候去检查你运行的另一个程序的变量类型(不被上一个程序的变量所影响)
接下来就是一个问题:
[y,Fs] = audioread('D:\FFOutput\许嵩 - 放肆.wav');
这个是什么意思呢?
首先()里边的是放的是绝对路径,我比较喜欢绝对路径,绝对路径就是告诉你电脑里边哪个文件的具体地址。犹如你在华东,华东哪呢?华东查查工大学查查校区查查栋查查宿舍。与绝对路径还有相类似概念叫相对路径,相对路径是什么意思呢?就比如说你是华东查查工查查校区查查被查查—_girl偷耳机的旁边那栋教学楼。这个“旁边”就是相对的意思了,如果那个人不知道偷耳机事件和查查工好大学就找不到路去那里。
所以——D:\FFOutput\许嵩 - 放肆.wav 是在D盘的FFOutput这个文件夹下边的许嵩 - 放肆.wav的这首歌 .wav是这首歌的文件形式,即后缀名的意思。
所以当你运行这段代码的时候你就得在你的电脑里改绝对路径咯,你要开哪个音频就用那个音频的路径和名字呗。
接下来解释 audioread是一个matlab 的关键词(一个封装好的函数,这个函数出现在16版本以上好像)
[y,Fs] = audioread(filename)
[y,Fs] = audioread(filename,samples)
[y,Fs] = audioread(___,dataType)
filename就是路径和文件名字咯。我代码里边用的就是第一种,这里不解释第二个和第三个,我代码没用这个。y是从这个函数运行了,出来了音频文件的响度(声音的大小)Fs是出来了这个音频文件的频率大小。
audioread函数支持解读wav、mp3、aac、flac、AIFF等音频文件。
fprint就是C语言的printf的含义,用法都一样,就是你想把那个变量展现出来就 (" ",xx) 呗。
n=length(y) 是什么意思呢?
length函数就是获取一个数组中的长度
打开工作区看看你就懂了
这就是n这个变量存储的形式,说白了这里n就是y的长度。
接下来我就要开始要进行傅里叶变换咯,
T=1/Fs; %采样周期
t=(1:n)*T; %采样时间
%
y1=fft(y); %做FFT变换
f=(0:n-1).*Fs/n;
plot(f,y1) %画出原始信号的频谱图
先变成周期在让他一个一个的出来,你看 t=(1:n)*T n的作用就在这,因为我需要把x轴上弄的是频率或者时间,所以就得用它的长度一个一个间隔地去取,遍历,再乘以周期数,
具体一点
: 1*T 2*T 3*T......以往下去放在一个数组里边,这个数组就是t。(matlab是不用定义一个数组的,他可以默认一个空的工作变量去存储,不要带着c的语法去思考为什么没有自声明)下边就是t存储了什么(如图所示)
频率也如此操作
但为什么频率要除以n呢?
因为我们在进行离散傅立叶变换时,是连加的,将所有采样的点都加在了一起,所以最后要除以N
(让二院的小伙伴们一起打开徐亚宁老师的信号与系统61页)
plot是什么意思呢?连点画图呗。把一个个离散的点给他连接起来画一个曲线出来展示
plot(x,y)x就是理论上的x轴,y就是y轴。
那title xlabel ylabel呢?
一个是给画出来的图起个名字 一个是给x、y轴起名字
那这个是什么意思呢?
abs(y_zp(1:n/2))
其实就是把傅里叶变换给他去半而变成实部的意思呗。(你得幅频响应出来的是那个幅度幅值把)
那为什么要去半呢?
让我们打开93页信号与系统书在阅读阅读:
(个人理解:我不取二分之一以下,我频谱出来的是混叠的东西那不是分析了个鸡毛?)
那subplot呢?
就是把几个图放在一起呗。
官话介绍一下:
subplot()是将多个图画到一个平面上的工具。其中,m 表示 p 个图排成 m 行,n 表示图排成 n 列,也就是整个figure中有 n 个图是排成一行的,一共 m 行,
如果 m=2 就是表示 2 行图。p 表示图所在的位置,p=1表示从左到右从上到下的第一个位置。
怒气在这里消了一点,还行。
randn 函数
Y = randn(n):返回一个n*n的随机项的矩阵。如果n不是个数量,将返回错误信息。
Y = randn(m,n) 或 Y = randn([m n]):返回一个m*n的随机项矩阵。
我在这里 randn(n,2); n就是声音的响度长度嘛,就得产生一个噪音一直在时域上跟着音频信号,然后2呢我是这么理解的,这是个二维的杂音信号。(本人理论可能还需要巩固总感觉这么解释不太对)
然后就把杂音加到音频上去呗。
y_Noise=y+Noise;
接下来就是重复操作了。
(我是分割线)
%快放
sound(y,2*Fs);
record(R1);
% sound(y,2*Fs);
pause(20)
Recording5 = getaudiodata(R1);
sound(Recording5)
这个是什么意思呢
这个是我参考的那个博主的介绍,非常感谢他,他让我解决了这个录音问题。在这里我不多废话,直接去他博客下面看吧。下面就是网址。
https://blog.csdn.net/ShanX_s/article/details/52947440?ops_request_misc=&request_id=&biz_id=102&utm_term=matlabaudiorecorder%20;&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-52947440.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187
sound(y,Fs) sound 这个函数无非就是播放嘛,然后y是响度,音量大小,Fs就是他的频率。两个合在一起才是一个正常的音频文件呗。不信你们自己可以sound(y)和sound(Fs)欣赏欣赏。