No BSD License  

Highlights from
Brown Acoustic Simulator

image thumbnail
from Brown Acoustic Simulator by Avram Levi
Creates a source to microphone impulse response in complex room enviroments

stf_r_s.m
c=340;%m/s
high_res_freq = [1:512]*fs/1024;
freq = [63 125 250 500 1000 2000 4000 8000];
hrad=0.13;

load 'utils\attn_high_res_full.mat'
load 'utils\can_data_variables.mat'
load 'utils\wall_data.mat'

aim = zeros(1, 3);
aim(2) = sin(el_or*pi/180);
aim(1) = cos(el_or*pi/180)*cos(az_or*pi/180);
aim(3) = -cos(el_or*pi/180)*sin(az_or*pi/180);
aim = source+aim;

%%
mic_dir_resp = [0];
mic_resp = [0];
file_ind=1;

eval(strcat('output_src', num2str(srcind), '=cell(', num2str(size(mic_locs, 1)), ',5);'));

for mic_ind=1:size(mic_locs, 1)
    mic = mic_locs(mic_ind, :);
    [coor, walls] = parse_mirimage(room,source,mic,scan_dist);

    d = (coor-repmat(source, size(coor,1), 1));
    dist = sqrt(sum((d.^2)'));

    az_stm = atan2(-d(:, 3), d(:, 1))*180/pi;
    flat_dist = sqrt(d(:, 1).^2+d(:, 3).^2);
    el_stm = atan2(d(:, 2), flat_dist)*180/pi;

    resp = [0];
    strcat('there are ', num2str(size(walls, 1)), ' virtual microphones for mic ', num2str(mic_ind))
    %     pause
    h = waitbar(0,strcat('source ', num2str(srcind), ' mic ', num2str(mic_ind), ' running'));
    for i=1:size(walls, 1)
        %         i
        path = walls(i, find(walls(i, :)+1));
        if length(path)==0;
            attn_wall=1;
            if get(handles.useHuman, 'value')==1%use human source model?
                tot_resp = stf(az_stm(i)-az_or, el_stm(i)-el_or, attn_interp, can_freqs, fs);
                extratime = round(head_delay(hrad,source,mic,aim,c)*fs);
                tot_resp = real(ifft(tot_resp, 1024));
                tot_resp = tot_resp(1:512);
            else
                tot_resp = zeros(1, 512);
                tot_resp(1) = 1;
                extratime=0;
            end
        else
            attn_wall=ones(1, 8);
            for j=1:length(wall_index)
                n = length(find(path==wall_index(j)));
                attn_wall = attn_wall.*(wall_coeffs(j, :).^n);
            end
            wall_resp = interp1(freq, attn_wall', high_res_freq, 'spline');
            wall_resp = max(wall_resp, 0);
            wall_resp(513:1024) = fliplr(wall_resp);
            if get(handles.useHuman, 'value')==1%use human source model?
                extratime = round(head_delay(hrad,source,mic,aim,c)*fs);
                attn_sour = stf(az_stm(i)-az_or, el_stm(i)-el_or, attn_interp, can_freqs, fs);
            else
                attn_sour = zeros(1, 1024);
                attn_sour(1) = 1;
                attn_sour = fft(attn_sour);
                extratime=0;
            end
            tot_resp = (attn_sour).*wall_resp;
            tot_resp = real(ifft(tot_resp, 1024));
            tot_resp = tot_resp(1:512);
        end
        attn_dist = 1/(2*dist(i));
        tot_resp = tot_resp*attn_dist;
        delay = round(dist(i)*fs/c);
        if length(resp)<delay+extratime+512
            resp(length(resp)+1:delay+extratime+512)=zeros(delay+extratime+512-length(resp), 1);
        end
        resp(delay+extratime+1:delay+extratime+512)=resp(delay+extratime+1:delay+extratime+512)+tot_resp;
        if length(path)==0
            dir_resp = resp;
        end
        waitbar(i/size(walls, 1))
    end
    close(h)
    resp = resample(resp, fs_real, fs);
    dir_resp = resample(dir_resp, fs_real, fs);
    avram = {dist(1), az_stm(1), el_stm(1), dir_resp, resp};%burada -az_stm(1) yaziyordu -'yi sildim 12 kasim 2007
    eval(strcat('output_src', num2str(srcind),'(', num2str(mic_ind), ', :)', '=avram;'));
end

Contact us at files@mathworks.com