MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 126|回复: 3|关注: 0

[已答复] 拜托各位帮忙我修改看看这程式

[复制链接]

新手

5 麦片

财富积分


050


5

主题

26

帖子

0

最佳答案
发表于 2017-9-14 20:55:25 | 显示全部楼层 |阅读模式
本帖最后由 土寶寶 于 2017-9-15 10:08 编辑

我要做的是声音重叠方面的,下面是我的程式,这支程式主要拿取一个音档,然后切成很多音框,再把他重叠在一起
原本我是分成 奇数偶数后在重叠
重点就红色 部份而已
可是现在想改成  用第二段前面长度平移x 和第一段后面重叠在一起,一直到最後
主要修改是红色字方面,其他不用更改
类似下面的图
希望有人可以帮修改看看这支程式



clear all; %%清除所有变量
[z,fs,nbits] = wavread('organ_last.wav'); %%读取音档
z = z(1:184320); %%音档取的长度
step = 1024; %%设定音框长度
calculation = round(length(z)/step); %%计算音框数量
Origin = 1; %%重第一个开始
time=(1:length(z))/fs; %%计算时间
for n = 1 : calculation %%分析各个音框
    start = Origin; %%重第一个开始
    z_frame = z((start+step*(n-1)):(start+step*n)-1, 1); %%切割音框

if n == 1
     z_frame1 = z_frame;
     z_frame1 = z_frame1.*hamming(step); %%乘上窗函数
     Z_frame1 = fft(z_frame1); %%快速傅立叶转换
     A = ifft(Z_frame1); %%变成复数
  
elseif n == 2
     z_frame2 = z_frame;
     z_frame2 = z_frame2.*hamming(step); %%乘上窗函数
     Z_frame2 = fft(z_frame2); %%快速傅立叶转换
     B = ifft(Z_frame2); %%变成复数
     C = [A;B]; %%把A矩阵放到C矩阵前方,把B矩阵放到C矩阵后方
     Z = [Z_frame1;Z_frame2]; %%依序把每个音框相连起来

else
     z_frame2 = z_frame;
     z_frame2 = z_frame2.*hamming(step);
     Z_frame2 = fft(z_frame2);
     B = ifft(Z_frame2);
     C = [C;B];
     Z = [Z;Z_frame2];
end
end


X_add1 = [];
X_add2 = []; %%假设两个空矩阵
S1 = C; %%所叠加的讯号
for i = 1 : calculation %%分析各音框
    start = 1;
    z_framel = S1((start+step*(i-1)):(start+step*i)-1, 1); %%切割音框
    z_framel = z_framel.*hamming(step); %%乘上窗函数
    if mod(i,2) == 1 %%i除以2余数为1(分出奇偶矩阵)
        a = z_framel;
        X_add1 = [X_add1;z_framel;z_framel];
    else
        b = z_framel;
        X_add2 = [X_add2;z_framel;z_framel];
    end
end

S = zeros(205,1); %%创建一个 第205行第1列的零矩阵
X_add1 = [X_add1;S] %%因为叠加两个音档长度要相同,所以一个前面给的,后面也要给
X_add1(1:205)=[];
X_add2 = [S;X_add2];
X_add2(size(X_add2)-204:size(X_add2),:)=[];  %%矩阵每个维度的长度
X_all = X_add1 + X_add2; %%将两个讯号叠加起来

sound(real(2*X_all),fs); 放出实部声音
I = z;
In = real(X_all); %%求实部部分
Ps=sum(I.^2); %%计算讯号功率
Pn1=sum(In.^2); %%计算失真功率
Pn2=abs(Ps-Pn1); %%取绝对值
sdr=10*log10(Ps/Pn2); %%计算SDR

我的

我的

需要修改

需要修改

新手

5 麦片

财富积分


050


5

主题

26

帖子

0

最佳答案
 楼主| 发表于 7 天前 | 显示全部楼层
拜托各位帮忙

新手

5 麦片

财富积分


050


2

主题

7

帖子

0

最佳答案
发表于 5 天前 | 显示全部楼层
本帖最后由 帮忙 于 2017-9-17 10:04 编辑

..............

新手

5 麦片

财富积分


050


2

主题

7

帖子

0

最佳答案
发表于 5 天前 | 显示全部楼层
拜托各位,只要类似能跑就好
我想很久真的用不出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

快速回复 返回顶部 返回列表