hrtf 旋转音效matlab实现
原理参考:
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实现的更多相关文章
- hrtf virtual surround matlab实现
将5.1 ch的数据经过hrtf处理,然后downmix到2ch,使得2ch的数据有virtual surround的效果. function output = hrir_process(input) ...
- 二维坐标的平移,旋转,缩放及matlab实现
本文结合matlab 软件解释二维坐标系下的平移,旋转,缩放 首先确定点在二维坐标系下的表达方法,使用一个1*3矩阵: Pt = [x,y,1] 其中x,y 分别为点的X,Y坐标,1为对二维坐标的三维 ...
- matlab中的三维坐标系与旋转
1. matlab中的三维坐标系 matlab中的三维坐标系是使用的右手坐标系: 输入以下代码: >> plot3(0,0,0) >> xlabel('axis X') > ...
- Matlab实现画柱状图坐标标签旋转
引言: 在用matlab画柱状图或者其他图的时候,你是否碰到下图这种情况: 乍一看这个柱状图画的有馍有洋的,but,仔细一看你会发现,横坐标标签如果再长一点就不好看啦,甚至会重叠,就像这样: 这样的图 ...
- Matlab之视角旋转函数[转]
Matlab中有两个视角旋转函数:view和rotate,下面详细介绍: view: 一: view(az,el):az是方位角,el是仰角,单位均是度.具体: 以x轴从左到右(即从小到大)平行放置在 ...
- matlab练习程序(旋转、径向模糊)
还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到 ...
- 用MATLAB绘制折线图,x轴为字符串,并旋转一定的角度!!!
先上代码,然后再一行一行解释: x=1:37; %这一行其实一开始,写的时候是没有的,后来需要给X轴上规定几个刻度才加上的 plot(x,Y,'linewidth',2); %以x为自变量,y为因变量 ...
- matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...
- Matlab 图像平移、旋转、缩放、镜像
今天学习了用Matlab实现对图像的基本操作.在Matlab中,图像是按照二维矩阵的形式表示的.所以对图像的操作就是对矩阵的操作. 对图像进行缩放.平移.旋转,都可以转化为矩阵的运算. 关于变换矩阵的 ...
随机推荐
- USB-Blaster CPLD FPGA Intel 驱动安装不上的问题,文件的哈希值不在指定的目录文件中,的解决办法,其实很简单
intel的官网的驱动安装文档: https://www.intel.com/content/www/us/en/programmable/support/support-resources/down ...
- 工作中遇到的js跨域问题总结
起因:之前在做一个项目的时候有这样一个问题,127.0.0.1域名上的一个页面A.html,需要访问127.0.0.2域名上B.html页面中的一个方法.这就涉及到JS跨域访问了,通过查阅资料,得以解 ...
- 使用scrapy框架爬取图片网全站图片(二十多万张),并打包成exe可执行文件
目标网站:https://www.mn52.com/ 本文代码已上传至git和百度网盘,链接分享在文末 网站概览 目标,使用scrapy框架抓取全部图片并分类保存到本地. 1.创建scrapy项目 s ...
- lucas定理 模板
lucas定理 (nm) mod p=(⌊np⌋⌊mp⌋)(n mod&VeryTh ...
- P1980 计数问题(int,string,stringstream)
题目描述 试计算在区间 1 到 n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 ...
- Vue中vue-i18n结合vant-ui实现国际化
(一)添加依赖模块 在package.json文件中添加vant模块的依赖,如: // package.json { "dependencies": { "vant&qu ...
- 论文阅读笔记(十七)【ICCV2017】:Dynamic Label Graph Matching for Unsupervised Video Re-Identification
Introduction 文章主要提出了 Dynamic Graph Matching(DGM)方法,以非监督的方式对多个相机的行人视频中识别出正确匹配.错误匹配的结果.本文主要思想如下图: 具体而言 ...
- Redis的各个数据的类型基本命令
什么是Redis: 概念: Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库. 特征:1. 数据间没有必然的关联 ...
- 对象浅拷贝Object.assign
const target = { a: { b: { c: { d: 1 } }, e: 5, f: 6, h: 10 } } const source = { a: { b: { c: { d: 1 ...
- C# WPF Bing地图展示
微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 内容目录 实现效果 业务场景 编码实现 本文参考 源码下载 1.实现效果 Bi ...