matlab应用 求解释 一行一行解释 再制作消除回声的代码 感激不尽

matlab应用 求解释 一行一行解释 再制作消除回声的代码 感激不尽,第1张

function echo(filename,n,m,p)

[song,Fs]=wavread(filename) %%读取filename文件,采样频率为Fs Hz,将其以矩阵的形式存放在矩阵song中

for k=1:m

echo=[zeros(round(Fs/n),2) %%为回声矩阵开辟空间,其前Fs/n * 2阶是零矩阵,后一部分为原来song矩阵的前一部分(第一行到第length(song)-round(Fs/n)行)

song((1:length(song)-round(Fs/n)),:)]

echosong=song+p*echo %%加入回声后新的波形矩阵为song+p*echo

song=echosong %%赋值

end

filename=[filename(1:end),'_echo']%%新的文件名后加了_echo

wavwrite(echosong,Fs,filename) %%将最终的波形矩阵写入新的文件中

要说明的是这个函数名好像跟matlab自带一个库函数名相同,建议你修改函数名后调用。

我试了一下

echo1('1.wav',3,3,.2)

效果很不错。

要是不清楚的地方可以追问

%我们使用QQ语音聊天的时候,如果不带耳机,而使用喇叭。那么麦克风会收到两个信号:第一个人声,第二个,从喇叭传出的声音(回声)。本程序用语消除回声。

%首先使长时间的FIR滤波器产生回声。(产生房间的冲击响应)

M = 4001

fs = 8000

[B,A] = cheby2(4,20,[0.1 0.7])

Hd = dfilt.df2t([zeros(1,6) B],A)

hFVT = fvtool(Hd) % Analyze the filter

set(hFVT, 'Color', [1 1 1])

H = filter(Hd,log(0.99*rand(1,M)+0.01).*sign(randn(1,M)).*exp(-0.002*(1:M)))

H = H/norm(H)*4 % Room Impulse Response

plot(0:1/fs:0.5,H)

xlabel('Time [sec]')

ylabel('Amplitude')

title('Room Impulse Response')

set(gcf, 'Color', [1 1 1])

%然后读取matlab里面自带的人声,并且播放(不必紧张,这不是英语听力)

load nearspeech

n = 1:length(v)

t = n/fs

plot(t,v)

axis([0 33.5 -1 1])

xlabel('Time [sec]')

ylabel('Amplitude')

title('Near-End Speech Signal')

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(v,fs)

playblocking(p8)

The Far-End Speech Signal

%现在播放回声:就是从喇叭发出,房间反d,最后被麦克风接收到的声音。这把声音是通过我们上面设计的FIR滤波器产生的

load farspeech

x = x(1:length(x))

dhat = filter(H,1,x)

plot(t,dhat)

axis([0 33.5 -1 1])

xlabel('Time [sec]')

ylabel('Amplitude')

title('Far-End Echoed Speech Signal')

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(dhat,fs)

playblocking(p8)

%人声和回声加在一起,麦克风接收到的实际声音是:

d = dhat + v+0.001*randn(length(v),1)

plot(t,d)

axis([0 33.5 -1 1])

xlabel('Time [sec]')

ylabel('Amplitude')

title('Microphone Signal')

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(d,fs)

playblocking(p8)

%使用频域自适应滤波器去除回声

mu = 0.025

W0 = zeros(1,2048)

del = 0.01

lam = 0.98

x = x(1:length(W0)*floor(length(x)/length(W0)))

d = d(1:length(W0)*floor(length(d)/length(W0)))

% Construct the Frequency-Domain Adaptive Filter

hFDAF = adaptfilt.fdaf(2048,mu,1,del,lam)

[y,e] = filter(hFDAF,x,d)

n = 1:length(e)

t = n/fs

pos = get(gcf,'Position')

set(gcf,'Position',[pos(1), pos(2)-100,pos(3),(pos(4)+85)])

subplot(3,1,1)

plot(t,v(n),'g')

axis([0 33.5 -1 1])

ylabel('Amplitude')

title('Near-End Speech Signal')

subplot(3,1,2)

plot(t,d(n),'b')

axis([0 33.5 -1 1])

ylabel('Amplitude')

title('Microphone Signal')

subplot(3,1,3)

plot(t,e(n),'r')

axis([0 33.5 -1 1])

xlabel('Time [sec]')

ylabel('Amplitude')

title('Output of Acoustic Echo Canceller')

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(e/max(abs(e)),fs)

playblocking(p8)

%凳凳凳凳,大功告成

%回声的产生方法很多,还有一种镜像法,模拟声音在一个六面体房间内墙面的每次反d。澳洲某个大学的哥们的个人主页上有程序,有兴趣可以找找。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12010923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存