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"的错误,导致图片无法生成 ...
随机推荐
- python变量加逗号,的含义
逗号,用于生成一个长度为1的元组 >>> (1) 1 >>> (1,) (1,) >>> 1, (1,) 因此需要将长度为1的元组中元素提取出来可 ...
- redis缓存优化
redis缓存优化 一.问题 在Javaweb项目中,如果每次刷新,所有资源都重新从数据库中读取,这样每次效率会很低,在这里可以使用redis非关系型数据库,将一些不经常变化得资源加载进内存中.提高效 ...
- 剑指offer-面试题46-把数字翻译成字符串-动态规划
/* 题目: 给定一个数字,将0~25依次翻译为a~z,计算有多少种翻译方法. */ /* 思路: 动态规划法 */ #include<iostream> #include<cstr ...
- 剑指offer-面试题33-二叉搜索树的后序遍历序列-二叉树遍历
/* 题目: 给定一个序列,判断它是否为某个二叉搜索树的后序遍历. */ /* 思路: 二叉搜索树:左子树<根节点<右子树. 序列的最右端为根节点,小于根节点的左半部分为左子树,大于根节点 ...
- Centos 7 firewall的防火墙的规则
这是官方文档: http://www.firewalld.org/documentation/man-pages/firewall-cmd.html 想使用iptables的规则,firewall也可 ...
- Java细节1--输入关闭
import java.util.Scanner; public class Demo01 { public static void main(String[] args) { Scanner sc= ...
- selenium webdriver执行远程 第三方js解决方案
今天一个朋友问我问题 考虑了下直接上代码,这是伪代码不能执行,但是给出了思路 代码 url = 'http://www.qingmiaokeji.cn/test.js' res = urllib.re ...
- 【Unity|C#】基础篇(1)——基础入门
[学习资料] <C#图解教程>(第2~12章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baid ...
- Winfom递归绑定树节点
/// <summary> /// 绑定树节点 /// </summary> /// <param name="pid"></param& ...
- Winform中怎样设置ContextMenuStrip右键菜单的选项ToolStripMenuItem添加照片
场景 怎样在Winform程序中添加鼠标右键时使子选项显示图片. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程 ...