使用matlab进行回声处理(三重回声)-数字信号处理课设

 一、系统设计要求

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 界面上 体现出来,使得用户体验感更好,操作更加便捷,将项目发挥的更好。

  • 20
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MATLAB中,可以使用Digital Signal Processing Toolbox中的函数来实现多回声前馈处理。下面是一个简单的步骤: 1. 读取语音信号使用`audioread`函数读取.wav格式的语音文件,将其转换为MATLAB中的数字信号。 2. 计滤波器:使用`fir1`或`firls`等函数计滤波器,其中滤波器的系数由回声时间和衰减系数确定。 3. 建立多回声前馈模型:使用`echo_gen`函数建立多回声前馈模型,该函数使用fir滤波器实现前馈和反馈路径。 4. 添加噪声:使用`awgn`函数添加噪声,模拟实际情况。 5. 进行回声前馈处理使用`filter`函数对语音信号进行滤波,去除回声信号。 6. 播放处理后的语音信号使用`sound`函数播放处理后的语音信号。 下面是一个简单的MATLAB代码示例: ``` % 读取语音信号 [x,fs] = audioread('speech.wav'); % 计滤波器 t = [0 0.01 0.02 0.03 0.04 0.05]; % 回声时间 a = [1 0.6 0.3 0.1 0.05 0.01]; % 衰减系数 b = zeros(1, length(t)+1); b(1) = 1; for i = 2:length(b) b(i) = a(i-1); end h = fir2(1024, t*2/fs, b); % 建立多回声前馈模型 y = echo_gen(x, fs, 0.7, t, a); % 添加噪声 y = awgn(y, 20, 'measured'); % 进行回声前馈处理 y_processed = filter(h, 1, y); % 播放处理后的语音信号 sound(y_processed, fs); ``` 其中,`echo_gen`函数的代码如下: ``` function [y] = echo_gen(x, fs, delay, amp, t60) % x: 输入信号 % fs: 采样率 % delay: 延迟时间 % amp: 前馈路径增益 % t60: 回声时间 M = round(delay*fs); % 延迟采样点数 r = amp.^(0:length(t60)-1); % 前馈路径增益 h = [1 zeros(1, M) r]; % 系统传递函数 y = filter(h, 1, x); % 带回声信号 end ``` 以上代码仅为简单示例,实际应用中需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渴望学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值