hrtf virtual surround matlab实现
将5.1 ch的数据经过hrtf处理,然后downmix到2ch,使得2ch的数据有virtual surround的效果。
function output = hrir_process(input)
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];
C = [13 9]
%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_c_l = squeeze(hrtf.hrir_l(C(1), C(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_c_r = squeeze(hrtf.hrir_r(C(1), C(2), :));
[input, fs] = wavread('input.wav');
h_l = zeros(length(h_l_l), 6);
h_l(:, 1) = h_l_l;
h_l(:, 2) = h_r_l;
h_l(:, 3) = h_c_l;
h_l(:, 5) = h_ls_l;
h_l(:, 6) = h_rs_l;
h_r = zeros(length(h_l_r), 6);
h_r(:, 1) = h_l_r;
h_r(:, 2) = h_r_r;
h_r(:, 3) = h_c_r;
h_r(:, 5) = h_ls_r;
h_r(:, 6) = h_rs_r;
hrir_out_l = zeros(length(input(:, 1), length(1, :));
hrir_out_r = zeros(length(input(:, 1), length(1, :));
for ch = 1:1:6
hrir_out_l(:, ch) = filter(h_l(:, ch), 1, input(:, ch));
hrir_out_r(:, ch) = filter(h_r(:, ch), 1, input(:, ch));
end
cmix = 0.707/2;
surmix = 1.0 / 2;
xsurmix = 0.5 /2;
%downmix to 2ch.
%output(:,1) = hrir_out_l(:, 1) + hrir_out_l(:, 3) * cmix - hrir_out_l(:, 5) * surmix - hrir_out_l(:, 6) * xsurmix ;
%output(:,2) = hrir_out_r(:, 2) + hrir_out_r(:, 3) * cmix +hrir_out_r(:, 6) * surmix + hrir_out_r(:, 5) * xsurmix;
%output(:,1) = hrir_out_l(:, 1) + hrir_out_l(:, 3) * cmix + hrir_out_l(:, 5) * surmix + hrir_out_l(:, 2) * xsurmix ;
%output(:,2) = hrir_out_r(:, 2) + hrir_out_r(:, 3) * cmix +hrir_out_r(:, 6) * surmix + hrir_out_r(:, 1) * xsurmix;
output(:,1) = hrir_out_l(:, 1) + hrir_out_l(:, 3) * cmix +hrir_out_l(:, 5) * surmix;
output(:,2) = hrir_out_r(:, 2) + hrir_out_r(:, 3) * cmix +hrir_out_r(:, 6) * surmix;
end
function [loro ltrt] = downmix(input)
cmix = 0.707/2;
surmix = 1.0 / 2;
xsurmix = 0.5 /2;
L = input(:, 1);
R = input(:, 2);
C = input(: 3);
Ls = input(: 5);
Rs = input(: 6);
loro(:, 1) = L + cmix * C + surmix * Ls;
loro(:, 2) = R + cmix * C + surmix * Rs;
ltrt(:, 1) = L + cmix* C - surmix* Ls - xsurmix * Rs;
ltrt(:, 2) = R + cmix * C + surmix * Ls + xsurmix * Rs;
end
main.m:
clc:
clear all;
[input, fs] = wavread('input.wav');
y = hrir_process(input);
[loro ltrt] = dowmix('input.wav');
wavwrite(y, fs, 'output.wav');
wavwrite(loro, fs, 'loro.wav');
wavwrite(ltrt, fs, 'ltrt.wav');
hrtf virtual surround matlab实现的更多相关文章
- hrtf 旋转音效matlab实现
原理参考: http://www.mahong.me/archives/97 将音频分段,各个段分别使用hrtf在Ls, L, R, Ls, Rrs, Lrs位置处的filter系数.是声音听起来来自 ...
- 转载:HRTF virtaul surround
https://blog.csdn.net/Filwl_/article/details/50503558 https://blog.csdn.net/lwsas1/article/details/5 ...
- 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)
http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...
- Linux x64 下 Matlab R2013a 300 kb 脚本文件调试的 CPU 占用过高问题的解决办法
(1) 系统+软件版本 CentOS 6.5 (Final), 64 位,内核initramfs-2.6.32-431.5.1.el6.x86_64, MATLAB Version: 8.1.0.60 ...
- Linux版Matlab R2015b的bug——脚本运行的陷阱(未解决)
0 系统+软件版本 系统:CentOS 6.7 x64, 内核 2.6.32-573.el6.x86_64软件:Matlab R2015b(包括威锋网和东北大学ipv6下载的资源,都测试过) 1 脚本 ...
- Matlab中的一些小技巧
(转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- matlab 2012 vs2010混合编程
电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...
- matlab 扩大虚拟内存
今天服务器挂了..用了自己电脑结果爆内存,分享一个扩大虚拟内存的方法,经测试有效.. 使用Matlab生成很大的图片时,碰到了"out of memory"的错误,导致图片无法生成 ...
随机推荐
- Java中顺序、并行与并发
顺序(sequential)用于表示多个操作依次处理.例如把十个操作交给一个人处理 并行(parallel)用于表示多个操作同时处理.比如是个操作分给两个人操作,两个人会并行处理 并发(concurr ...
- opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素
动态地址访问像素:src.at<Vec3b>(i, j)[0].src.at<uchar>(i, j) int b = src.at<Vec3b>(i, j)[0 ...
- 【python基础语法】运算符&if条件语句&while循环&for循环(第5天课堂笔记)
""" if语法规则: if 条件比较语句1: # 条件成立的时候 会执行的代码 elif 条件比较语句2: # 条件2成立的时候 会执行的代码 else: # 条件不成 ...
- js中div显示和隐藏钮为什么页面总是跳一下到最上面
<div class="menu_left"> <ul > <li id="t1" style="background- ...
- Game with string CodeForces - 1104B
虽然只是B题,还是div2的 但感觉挺有意思,所以写一篇博客记录一下 最初的想法是利用DP去做,f[s]=true表示字符串s对应先手赢,否则对应后手赢,大致想了下发现是指数级别的算法,看了下范围直接 ...
- conda使用以前安装的python环境
在装anaconda时,很多时候,我们自己之前安装了python环境,里面装了很多的包,不想换,所以想直接使用原来的python环境,所以可以使用以下命令: conda create --prefix ...
- 全网VIP视频解析接口
全网VIP视频在线解析可以免费观看[腾讯vip视频.爱奇艺vip视频.优酷VIP视频.土豆VIP视频.乐视VIP视频.芒果VIP视频]等等...可以vip免费观看.去广告等等. https vip视频 ...
- SpringBoot整合WEB开发--(八)启动任务系统
简介: 有一些特殊的任务需要在系统启动时执行,例如配置文件的加载,数据库初始化等操作,如果没有使用SpringBoot,这些问题可以在Listener中解决.SpringBoot提供了两种解决方案:C ...
- java - GC垃圾收集器详解(三)
以前收集器的特点 年轻代和老年代是各自独立且连续的内存块 年轻代收集必须使用单个eden+S0+S1进行复制算法 老年代收集扫描整个老年代区域 都是以尽可能少而快速地执行GC为设计原则 G1是什么 G ...
- Mac 多版本 JDK 管理
Mac 多版本 JDK 管理 1. 准备 ZSH Homebrew Oracle JDK 1.8 安装包(Homebrew 官方源和第三方源不再提供老版本的 Oracle JDK) 2. 安装 JDK ...