1.录制一段声音信号,作为原音频信号,生成频域与时域图形,观察与分析其时域 与频域图形。
2.对该音频信号进行时域处理,并且实现对该声音信号添加第一层回声。
3.对该音频信号再继续一次进行时域处理,实现对该声音信号添加第二层回声。
4.将三段音频信号进行合成,比较该声音信号与原音频信号时域和频域的差别, 保存合成的音频。
5.对该声音信号进行时域或者频域处理,消除该添加回声的语音信号的回声。
6.比较原始声音信号与去除回声后的声音信号的频域和时域差别,并通过人耳辨 别原音频,加入回声的音频和去除回声的音频三段音频的区别。
二、系统设计方案
第一步:用 getaudiodata()函数录制一段音频生成并观察其时域和频域图形,再对其 时域频域进行处理。
第二步:添加回声。通过补零矩阵增加回声,且分别将原音频分别进行衰减系数为 0.6 倍和 0.4 倍的缩放,而后将三段音频结合在一起,使得得到音频有一层原声,两层 回声,且从原声到回声一层比一层音量小,得到处理后的声音信号就是有回声的声音 信号,绘制并观察有回声的声音信号的频域时域图形。
第三步:通过 z 域分析得到转换公式,对修改后声音信号时域进行处理。将添加的 回声消除,得到消除回声音频,再次绘制并观察新的声音信号的时域频域图形。
第四步:将三个时域频域图形进行对比,并把三段音频分别播放,用人耳进行区分 其差距
三、代码实现
1.录制音频代码:
%%%录制音频
clear all
clc
fs=44100
music=audiorecorder(fs,16,1)
disp('请输入空格并回车开始采集原始信号')
in=input('')
%创建一个保存音频信息的对象,它包含采样率,时间和录制的音频信息等等。
%44100表示采样为44100Hz
%16为用16bits存储,2为两通道即立体声(也可以改为1即单声道)。
recordblocking(music,7)
%开始录制,此时对着麦克风说话即可,录制时间为7秒。
myspeech=getaudiodata(music,'int16')
%得到数字矩阵存储的刚录制的音频信号。
plot(myspeech)
%% save file
filename='myspeech.wav'
audiowrite(filename,myspeech,fs)
登录后复制
2.对录制音频进行采集处理:
%%%%对音频采集处理
clear
[x,fs] = audioread('myspeech.wav')%音乐信号
%输出频率
fs
%音乐语音信号分声道处理
x1=x(:,1)
登录后复制
3.画出录制音频信号时域频域波形图
%画音乐信号时域图
n1=length(x1)%length取音乐数列长度即元素个数
figure(1)
subplot(2,1,1)
t1=(0:(n1-1))/fs
plot(t1,x1)
axis([0,5,-1,1])%%设置坐标轴范围
xlabel('时间t')
ylabel('幅度')
title('原音频音乐信号时域波形')
X1=fft(x1,n1)
subplot(2,1,2)
f3=0:fs/n1:fs*(n1-1)/n1
plot(f3,abs(X1))
axis([0,44100,0,6000])
xlabel('频率f')
ylabel('幅度')
title('原音频音乐信号频谱波形')
登录后复制
4.增加回音(这里我加了两重回音)
% %音乐信号的回音
x11=x1%截取部分
x11=x11'%因为输出为一列所以要转置成一行
geshu=length(x11)
N2 = 20000
int0=zeros(1,N2)%1行20000列的零矩阵
temp1=[x11,int0,int0]%原始声音
temp2=[int0,0.6*x11,int0]%第一层的回声是原始0.6倍
temp3=[int0,int0,0.4*x11]%第二层的回声是原始0.4倍
hui=temp1+temp2+temp3%三重声音相加实现回声
N=length(hui) %回音序列的长度
% sound(hui,fs)%播放回音音乐
登录后复制
5.画出回声波形,并保存回声为音频文件
%%%画回声波形
figure(2)
subplot(2,1,1)
t1=(0:(N-1))/fs
plot(t1,hui)
axis([0,4.5,-1,1])
xlabel('时间')
ylabel('幅度')
title('音频回声信号时域波形')
X2=fft(hui,N)
subplot(2,1,2)
f3=0:fs/N:fs*(N-1)/N
plot(f3,abs(X2))
axis([0,44100,0,6000])
xlabel('频率f')
ylabel('幅度')
title('音频回声信号频谱波形')
audiowrite('音频回声.wav',hui,fs)%保存回声整体为声音文件
登录后复制
6.消除回声
%%消除回声
% N = 20000
chang=N2+geshu
L = length(hui)
y = zeros(1, L)%与回声长度相同的零序列
for k = 1:L
if k>N2 &&k<=chang %%%消除第一层回声
y(k) = hui(k) - 0.6*x11(k-N2)
else
y(k) = hui(k)
end
if k>2*N2 %%%消除第二层回声
y(k)=y(k)-0.4*x11(k-2*N2)
end
end
N3 = length(y)
audiowrite('消除回声.wav',y,fs)%%保存为消除回声音频文件
登录后复制
四、展望
本项目在日后的学习中,应对其进行用户体验感以及完善其功能的更新,设计 GUI 界面使得整个系统 *** 作更加便捷,采用多线程的方式进行编程,增加整个系统能够完 成的功能,后续将更新出既能导入本身存在的音频,又可以重新录制音频进行增加回 声,消除回声以及绘制相关音频信号的时域频域波形图的功能,同时可以设定相关的 回声信号衰减系数,自定义的完成回声信号的添加使用,并将这些功能在 GUI 界面上 体现出来,使得用户体验感更好, *** 作更加便捷,将项目发挥的更好。
这个很简单的,要多动动脑。string inputStr = Console.ReadLine()
string temp=inputStr
int index = inputStr.IndexOf(" ")
Console.WriteLine(inputStr)
while (index != -1)
{
temp = temp.Substring(index+1)
Console.WriteLine(temp)
index = temp.IndexOf(" ")
}
Console.ReadLine()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)