原理参考:

http://www.mahong.me/archives/97

将音频分段,各个段分别使用hrtf在Ls, L, R, Ls, Rrs, Lrs位置处的filter系数。是声音听起来来自Ls, L, R, Rs, Rrs, Lrs,就有旋转效果。

hrtf = load("E:\CIPIC_hrtf_database\standard_hrir_database\subject_21\hrir_final.mat");

Ls = [1 9];

L = [8 9];

R= [17 9];

Rs = [25 9];

Rrs = [17 41];

Lrs = [8 41];

%source from 5.1 to L ch

h_l_l = squeeze(hrtf.hrir_l(L(1), L(2), :));

h_r_l = squeeze(hrtf.hrir_l(R(1), R(2), :));

h_ls_l = squeeze(hrtf.hrir_l(Ls(1), Ls(2), :));

h_rs_l = squeeze(hrtf.hrir_l(Rs(1), Rs(2), :));

h_lrs_l = squeeze(hrtf.hrir_l(Lrs(1), Lrs(2), :));

h_rrs_l = squeeze(hrtf.hrir_l(Rrs(1), Rrs(2), :));

%source from 5.1 to R ch

h_l_r = squeeze(hrtf.hrir_r(L(1), L(2), :));

h_r_r = squeeze(hrtf.hrir_r(R(1), R(2), :));

h_ls_r = squeeze(hrtf.hrir_r(Ls(1), Ls(2), :));

h_rs_r = squeeze(hrtf.hrir_r(Rs(1), Rs(2), :));

h_lrs_r = squeeze(hrtf.hrir_r(Lrs(1), Lrs(2), :));

h_rrs_r = squeeze(hrtf.hrir_r(Rrs(1), Rrs(2), :));

[input, fs] = wavread('input.wav');

h_l = zeros(length(h_l_l), 6);

h_l(:, 1) = h_ls_l;

h_l(:, 2) = h_l_l;

h_l(:, 3) = h_r_l;

h_l(:, 4) = h_rs_l;

h_l(:, 5) = h_rrs_l;

h_l(:, 6) = h_lrs_l;

h_r = zeros(length(h_l_r), 6);

h_r(:, 1) = h_ls_r;

h_r(:, 2) = h_l_r;

h_r(:, 3) = h_r_r;

h_r(:, 4) = h_rs_r;

h_r(:, 5) = h_rrs_r;

h_r(:, 6) = h_lrs_r;

idx = 0;

%change to another direction every 2 second (every N samples)

N = fs * 2;

%divide audio to loop segment, each segment has N samples

loop = int32(length(input(:, 1)) / N);

fadeSize = 1024;

win = hamming(fadeSize * 2, 'symmetric');

fadeIn = win(1: fadeSize, 1);

fadeOut = win(fadeSize + 1 : fadeSize * 2, 1);

y = zeros(length(input(:, 1)), 2);

fadeInData = zeros(fadeSize, loop-1, 2);

fadeOutData = zeros(fadeSize, loop-1, 2);

fadeOutStartIdx = N - fadeSize;

outputStartIdx = 1;

for i = 1:1:loop-1

  idx = mod(i, 6);

  if idx == 0

    idx = 6;  

  end

  %current segment is inputStartIdx ~inputEndIdx

  inputStartIdx = int32((i-1) * N + 1);

  inputEndIdx = int32(i * N);

  pInput = pOutput = zeros(N, 2);

  pInput(:, 1) = input(inputStartIdx : inputEndIdx, 1);

  pInput(:, 2) = input(inputStartIdx : inputEndIdx, 2);

  if i * N < length(input(:, 1))

    %current segment filter with HRTF, which make the sound comes from direction idx.

    pOutput(:, 1) = filter(h_l(:, idx), 1, pInput(:, 1));

    pOutput(:, 2) = filter(h_l(:, idx), 1, pInput(:, 2));

  end

  %fadeIn fadeOut at the begine & end of current segment to avoid pop noise

  fadeInData(: ,i, 1) = pOutput(1: fadeSize, 1) .* fadeIn;

  fadeInData(: ,i, 2) = pOutput(1: fadeSize, 2) .* fadeIn;

  fadeOutData(: ,i, 1) = pOutput(fadeOutStartIdx + 1: N, 1) .* fadeOut;

  fadeOutData(: ,i, 2) = pOutput(fadeOutStartIdx + 1: N, 2) .* fadeOut;

  if i > 1

    %add the cross fade data at the begin & end of segment

    y(outputStartIdx:outputStartIdx + fadeSize-1, 1) = fadeInData(:, i, 1) + fadeOutData(:, i-1, 1);

    y(outputStartIdx:outputStartIdx + fadeSize-1, 2) = fadeInData(:, i, 2) + fadeOutData(:, i-1, 2);

  else

    %the first segment

    y(outputStartIdx:outputStartIdx + fadeSize-1, 1) = fadeInData(:, i, 1) ;

    y(outputStartIdx:outputStartIdx + fadeSize-1, 2) = fadeInData(:, i, 2) ;

  end

  y(outputStartIdx + fadeSize + 1: outputStartIdx + fadeOutStartIdx , 1) = pOutput(fadeSize+1: fadeOutStartIdx, 1);

  y(outputStartIdx + fadeSize + 1: outputStartIdx + fadeOutStartIdx , 2) = pOutput(fadeSize+1: fadeOutStartIdx, 2);

  outputStartIdx = outputStartIdx + fadeOutStartIdx;

end

% low pass filter to avoid pop noise at the begin & end of segment

wn = 10000 / fs;

[B, A] = butter(8, wn, 'low');

y = filter[B, A, y]

wavwrite(y, fs, 'output.wav');

hrtf 旋转音效matlab实现的更多相关文章

  1. hrtf virtual surround matlab实现

    将5.1 ch的数据经过hrtf处理,然后downmix到2ch,使得2ch的数据有virtual surround的效果. function output = hrir_process(input) ...

  2. 二维坐标的平移,旋转,缩放及matlab实现

    本文结合matlab 软件解释二维坐标系下的平移,旋转,缩放 首先确定点在二维坐标系下的表达方法,使用一个1*3矩阵: Pt = [x,y,1] 其中x,y 分别为点的X,Y坐标,1为对二维坐标的三维 ...

  3. matlab中的三维坐标系与旋转

    1. matlab中的三维坐标系 matlab中的三维坐标系是使用的右手坐标系: 输入以下代码: >> plot3(0,0,0) >> xlabel('axis X') > ...

  4. Matlab实现画柱状图坐标标签旋转

    引言: 在用matlab画柱状图或者其他图的时候,你是否碰到下图这种情况: 乍一看这个柱状图画的有馍有洋的,but,仔细一看你会发现,横坐标标签如果再长一点就不好看啦,甚至会重叠,就像这样: 这样的图 ...

  5. Matlab之视角旋转函数[转]

    Matlab中有两个视角旋转函数:view和rotate,下面详细介绍: view: 一: view(az,el):az是方位角,el是仰角,单位均是度.具体: 以x轴从左到右(即从小到大)平行放置在 ...

  6. matlab练习程序(旋转、径向模糊)

    还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到 ...

  7. 用MATLAB绘制折线图,x轴为字符串,并旋转一定的角度!!!

    先上代码,然后再一行一行解释: x=1:37; %这一行其实一开始,写的时候是没有的,后来需要给X轴上规定几个刻度才加上的 plot(x,Y,'linewidth',2); %以x为自变量,y为因变量 ...

  8. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色

    一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...

  9. Matlab 图像平移、旋转、缩放、镜像

    今天学习了用Matlab实现对图像的基本操作.在Matlab中,图像是按照二维矩阵的形式表示的.所以对图像的操作就是对矩阵的操作. 对图像进行缩放.平移.旋转,都可以转化为矩阵的运算. 关于变换矩阵的 ...

随机推荐

  1. 大数据才是未来,Oracle、SQL Server成昨日黄花?

    1. 引子**** 有人在某个专注SQL的公众号留言如下: 这个留言触碰到一个非常敏感的问题:搞关系型数据库还有前途吗?现在都2020年了,区块链正火热,AI人才已经"过剩",大数 ...

  2. c#XML的基本使用

    创建XML文档 static void Main(string[] args) { //1.引入命名空间 //2.创建XML文档对象 XmlDocument xmldoc = new XmlDocum ...

  3. 【机器学习】使用CNN神经网络实现对图片分类识别及模型转换

    仅做记录,后面慢慢整理 训练函数: from skimage import io, transform # skimage模块下的io transform(图像的形变与缩放)模块 import glo ...

  4. 【剑指Offer】58:二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题解一:递归 //既然给了二叉树的某个结点,且二叉树存 ...

  5. Python_3

    """ Function_1: 寻找水仙花数. 水仙花数也被称为超完全数字不变数.自恋数.自幂数.阿姆斯特朗数, 它是一个3位数,该数字每个位上数字的立方之和正好等于它本 ...

  6. 理财收益的计算 计算浮点数的n次方 1466

    题目描述 老傻非常喜欢购买理财产品,而且这款理财产品被推销人员吹得特别高,对于贪财的老傻来说正中下怀,于是在心里盘算着买了它,自己就是亿万富豪,现需要你编写一个程序,帮老傻计算其收益,老傻的投入是R( ...

  7. C++->10.3.2-3,使用文件流类录入数据,并统计行数

    题目:建立一个文本文件,从键盘录入一篇短文存放在该文件中短文由若干行构成,每行不超过80个字符,并统计行数. /* #include<iostream.h>#include<stdl ...

  8. 手动安装 saltshaker-plus 版本选择特别说明(后期重点讲解Docker安装方式)

    前后端都建议使用1.12版本

  9. STL与基本数据结构

    目录 Vector list -- 链表 Stack -- 栈 queue -- 队列 优先队列 -- priority_ queue set -- 集合 multiset map 这是我第一次用Ma ...

  10. 如何在 messager/alert/confirm等消息提示框中 获取 / 设置 嵌入 html内容中的 input[type=checkbox]等的选中状态?

    总结, 有3点: 不能/不要 在 这些消息框 / 提示框/ 对话框中的 回调函数中去写代码: 获取嵌入 内容中input.checkbox的选中状态, 因为 虽然在这些框存在的时候, 这个 check ...