原理参考:

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. formateDate

    function formateDate(fmt, date) { let _this = new Date(date) let o = { "M+": _this.getMont ...

  2. vim 配置 jedi-vim( ubuntu:15.10 )

    确保 vim 支持 python3 或者 python 如果你已经安装了 vim, 可以通过vim --version, 在输出中找到 +python3 或者 +python 字样的话, 就可以跳过该 ...

  3. VISIO 的一些技巧

    1.复制绘图 如果格式改变,在“设计”选项卡里将“将主题运用于新建的形状”前面的√去掉

  4. form表单中给input 添加 数量可以增减的按钮

    只需给input表单增加type=number即可

  5. 10、初识constexpr和常量表达式

    常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.显然字面值属于常量表达式,用于表达式初始化的const对象也是常量表达式. 1.判断一个变量是不是常量表达式 一个对象(表达式)是不是 ...

  6. Spring学习笔记-高级装配-03

    主要内容: ●Spring profile ●条件化的bean声明 ●自动装配与歧义性 ● Spring表达式语言 本章介绍一些高级的装配技术,可实现更为高级的装配功能. 环境与profile 软件开 ...

  7. Android中的Service基础

    Service主要用于后台程序和跨进程访问,可以在不显示界面的前提下完成任务,不影响用户的其他操作. 这里我展示一些基本的用法 新建一个Service类 package com.example.ser ...

  8. npm ERR! Cannot read property 'match' of undefined

    在Vue项目中运行npm i命令时直接提示npm ERR! Cannot read property 'match' of undefined错误了,此时需要把package-lock.json文件删 ...

  9. Luogu2577 | [ZJOI2005]午餐 (贪心+DP)

    题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他 ...

  10. Java集合之Arrays 剖析

    Arrays工具类位于 java.util 包下,是一个比较常用的工具类,其可以针对数组进行各种操作,比如赋值.排序.搜索等等.在项目过程中我们针对数组的有关操作,如果不方便直接操作,均可通过调用此类 ...