将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实现的更多相关文章

  1. hrtf 旋转音效matlab实现

    原理参考: http://www.mahong.me/archives/97 将音频分段,各个段分别使用hrtf在Ls, L, R, Ls, Rrs, Lrs位置处的filter系数.是声音听起来来自 ...

  2. 转载:HRTF virtaul surround

    https://blog.csdn.net/Filwl_/article/details/50503558 https://blog.csdn.net/lwsas1/article/details/5 ...

  3. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

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

  5. Linux版Matlab R2015b的bug——脚本运行的陷阱(未解决)

    0 系统+软件版本 系统:CentOS 6.7 x64, 内核 2.6.32-573.el6.x86_64软件:Matlab R2015b(包括威锋网和东北大学ipv6下载的资源,都测试过) 1 脚本 ...

  6. Matlab中的一些小技巧

    (转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...

  7. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  8. matlab 2012 vs2010混合编程

    电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...

  9. matlab 扩大虚拟内存

    今天服务器挂了..用了自己电脑结果爆内存,分享一个扩大虚拟内存的方法,经测试有效.. 使用Matlab生成很大的图片时,碰到了"out of memory"的错误,导致图片无法生成 ...

随机推荐

  1. 证明task线程是来源于线程池的,线程重用

    1.线程池是单例的,全局唯一的,设置线程池最大活跃线程数是5,设置后,允许同时并发的Task只有5个,我们开启100个task去做任务,从最后的输出结果看到,虽然开启了100个task,但是线程id始 ...

  2. 使用高精度计算斐波那契数列 c++

    使用高精度计算斐波那契数列 非高精度 Code(Non-high accuracy) 这是不用高精度的代码 #include<bits/stdc++.h> using namespace ...

  3. Android_小账本_筛选功能的实现

    昨天对小账本的相关功能做了完善,新增了筛选功能. 支持对类型.收支项.日期进行修改. 但暂时尚不完善,只能针对相关小项进行筛选,无法连续对小项的结果进行筛选.这一功能预计在本周三进行完善. 相关代码 ...

  4. JS获取标签内容的方法

    JS获取标签内容的方法 测试代码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  5. openlayers画区域

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. Codeforces Round #592 (Div. 2) E

    给你一个数组,你最多可以进行k次操作,每次操作可以使一个数+1或者-1,问操作之后数组的极差最小可能是多少 利用map来模拟移动,可以观察到每次应该选择数量少的一组数让他们进行移动是最优的 int m ...

  7. StyleLint 使用指南

    StyleLint 是『一个强大的.现代化的 CSS 检测工具』, 与 ESLint 类似, 是通过定义一系列的编码风格规则帮助我们避免在样式表中出现错误. 安装stylelint npm insta ...

  8. wfuzz的使用

    用于模糊测试,测试过滤字符 转载:https://www.secpulse.com/archives/81560.html https://www.freebuf.com/sectool/173746 ...

  9. win10系统中按顺序安装jdk、tomcat

    一.首先安装jdk1.8,重点在于配置环境 安装步骤见另一篇软件安装中的博客 配置环境 1.首先要打开系统环境变量配置的页面.具体操作是:桌面上找到“此电脑”,然后右键 “属性”. 然后打开高级系统配 ...

  10. 关于IO板的输出(Do的写入)

    IO板的输入输出遵循MODBUS协议 1.单个DO开关量寄存器写入-功能码05 例子-打开信道3 01 05 00 02 00 00 CD CA 01 从机地址(由io的配置文件决定) 05  功能码 ...