├── README.txt ├── demo_cdr_dereverb.m ├── estimate_cdr_nodiffuse.m ├── estimate_cdr_nodoa.m ├── estimate_cdr_robust_unbiased.m ├── estimate_cdr_unbiased.m ├── lib ├── estimate_cpsd.m ├── estimate_delay_gcc_phat.m ├── estimate_psd.m ├── filterbank │ ├── DFTAnaRealEntireSignal.m │ ├── DFTSynRealEntireSignal.m │ └── prototype_K512_N128_Lp1024.mat └── spectral_subtraction.m ├── license.txt └── wav ├── out.wav └── roomC-2m-75deg.wav /README.txt: -------------------------------------------------------------------------------- 1 | *************************************************************************** 2 | Description 3 | *************************************************************************** 4 | 5 | This archive contains MATLAB code for CDR-based dereverberation as 6 | described in [1]. See demo_cdr_dereverb.m to get started. 7 | 8 | [1] Andreas Schwarz, Walter Kellermann, "Coherent-to-Diffuse Power Ratio 9 | Estimation for Dereverberation", IEEE/ACM Trans. on Audio, Speech and 10 | Lang. Proc., 2015 (under review); preprint available: arXiv:1502.03784 11 | PDF: http://arxiv.org/pdf/1502.03784 12 | 13 | *************************************************************************** 14 | Changes 15 | *************************************************************************** 16 | 17 | 1.0 - 2014-10-29: 18 | Initial version 19 | 1.1 - 2015 20 | - The magnitude of the coherence is now limited in the estimators in order to 21 | prevent numerical problems. 22 | - Changed reference to journal paper. 23 | 24 | *************************************************************************** 25 | License 26 | *************************************************************************** 27 | Copyright (c) 2014, Chair of Multimedia Communications and Signal Processing, 28 | Friedrich-Alexander-Universitaet Erlangen-Nuernberg (FAU) 29 | 30 | Redistribution and use in source and binary forms, with or without 31 | modification, are permitted provided that the following conditions are met: 32 | 33 | 1. Redistributions of source code must retain the above copyright notice, 34 | this list of conditions and the following disclaimer. 35 | 36 | 2. Redistributions in binary form must reproduce the above copyright notice, 37 | this list of conditions and the following disclaimer in the documentation 38 | and/or other materials provided with the distribution. 39 | 40 | 3. Neither the name of the copyright holder nor the names of its contributors 41 | may be used to endorse or promote products derived from this software without 42 | specific prior written permission. 43 | 44 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 45 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 46 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 47 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 48 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 49 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 50 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 51 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 52 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 53 | OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 54 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /demo_cdr_dereverb.m: -------------------------------------------------------------------------------- 1 | %DEMO_CDR_DEREVERB 2 | % 3 | % Demonstration of CDR-based noise and reverberation suppression. 4 | % 5 | % To use this with your own recordings: 6 | % 1. Change wave filename 7 | % 2. Adapt microphone spacing (cfg.d) 8 | % 2. Adapt cfg.TDOA, or use the DOA-independent estimator (estimate_cdr_nodoa) 9 | % 10 | % Reference: 11 | % Andreas Schwarz, Walter Kellermann, "Coherent-to-Diffuse Power Ratio 12 | % Estimation for Dereverberation", IEEE/ACM Trans. on Audio, Speech and 13 | % Lang. Proc., 2015 (under review); preprint available: arXiv:1502.03784 14 | % PDF: http://arxiv.org/pdf/1502.03784 15 | % 16 | % Andreas Schwarz (schwarz@lnt.de) 17 | % Multimedia Communications and Signal Processing 18 | % Friedrich-Alexander-Universitaet Erlangen-Nuernberg (FAU) 19 | % Cauerstr. 7, 91058 Erlangen, Germany 20 | 21 | addpath(genpath('lib')); 22 | 23 | %% filterbank initialization 24 | cfg.K = 512; % FFT size 25 | cfg.N = 128; % frame shift 26 | cfg.Lp = 1024; % prototype filter length 27 | %p=IterLSDesign(cfg.Lp,cfg.K,cfg.N); 28 | load('lib/filterbank/prototype_K512_N128_Lp1024.mat'); 29 | 30 | %% algorithm and scenario configuration 31 | cfg.fs = 16000; % sampling rate [Hz] 32 | cfg.c = 342; % speed of sound [m/s] 33 | cfg.d_mic = 0.08; % mic spacing [m] 34 | 35 | % all estimators except estimate_cdr_nodoa require the TDOA of the signal; make sure 36 | % to adapt this when loading another wave file 37 | cfg.TDOA = 2.15e-04; % ground truth for wav/roomC-2m-75deg.wav 38 | 39 | cfg.nr.lambda = 0.68; % smoothing factor for PSD estimation 40 | cfg.nr.mu = 1.3; % noise overestimation factor 41 | cfg.nr.floor = 0.1; % minimum gain 42 | %cfg.nr.alpha = 1; cfg.nr.beta = 1; % power subtraction 43 | cfg.nr.alpha = 2; cfg.nr.beta = 0.5; % magnitude subtraction 44 | %cfg.nr.alpha = 2; cfg.nr.beta = 1; % Wiener filter 45 | 46 | %cfg.estimator = @estimate_cdr_unbiased; % unbiased estimator (CDRprop1) 47 | cfg.estimator = @estimate_cdr_robust_unbiased; % unbiased, "robust" estimator (CDRprop2) 48 | %cfg.estimator = @estimate_cdr_nodoa; % DOA-independent estimator (CDRprop3) 49 | %cfg.estimator = @estimate_cdr_nodiffuse; % noise coherence-independent estimator (CDRprop4; does not work for TDOA -> 0!) 50 | 51 | %% preparation 52 | [x,fs_in] = audioread('wav/roomC-2m-75deg.wav'); 53 | x = resample(x,cfg.fs,fs_in); 54 | 55 | %% Signal processing 56 | % The algorithm itself is real-time capable, i.e., no processing of the entire 57 | % utterance is necessary. Here however, for efficiency of the MATLAB implementation, 58 | % the entire signal is processed at once. 59 | 60 | fprintf('Performing signal enhancement... ');tic; 61 | 62 | % analysis filterbank 63 | X=DFTAnaRealEntireSignal(x,cfg.K,cfg.N,p); 64 | 65 | % estimate PSD and coherence 66 | Pxx = estimate_psd(X,cfg.nr.lambda); 67 | Cxx = estimate_cpsd(X(:,:,1),X(:,:,2),cfg.nr.lambda)./sqrt(Pxx(:,:,1).*Pxx(:,:,2)); 68 | 69 | frequency = linspace(0,cfg.fs/2,cfg.K/2+1)'; % frequency axis 70 | 71 | % define coherence models 72 | Css = exp(1j * 2 * pi * frequency * cfg.TDOA); % target signal coherence; not required for estimate_cdr_nodoa 73 | Cnn = sinc(2 * frequency * cfg.d_mic/cfg.c); % diffuse noise coherence; not required for estimate_cdr_nodiffuse 74 | 75 | % apply CDR estimator (=SNR) 76 | SNR = cfg.estimator(Cxx, Cnn, Css); 77 | SNR = max(real(SNR),0); 78 | 79 | weights = spectral_subtraction(SNR,cfg.nr.alpha,cfg.nr.beta,cfg.nr.mu); 80 | weights = max(weights,cfg.nr.floor); 81 | weights = min(weights,1); 82 | 83 | % postfilter input is computed from averaged PSDs of both microphones 84 | Postfilter_input = sqrt(mean(abs(X).^2,3)) .* exp(1j*angle(X(:,:,1))); 85 | 86 | % apply postfilter 87 | Processed = weights .* Postfilter_input; 88 | 89 | % synthesis filterbank 90 | y = DFTSynRealEntireSignal(Processed,cfg.K,cfg.N,p); 91 | fprintf('done (%.2fs).\n', toc); 92 | 93 | %% output 94 | % write output file 95 | audiowrite('wav/out.wav',y,cfg.fs); 96 | 97 | %% visualization 98 | figure(1) 99 | subplot(211) 100 | imagesc(10*log10(SNR)) 101 | set(gca,'YDir','normal') 102 | caxis([-15 15]) 103 | colorbar 104 | title('Estimated CDR (=SNR) [dB]') 105 | xlabel('frame index') 106 | ylabel('subband index') 107 | subplot(212) 108 | imagesc(weights) 109 | set(gca,'YDir','normal') 110 | caxis([0 1]) 111 | colorbar 112 | title('Filter gain') 113 | xlabel('frame index') 114 | ylabel('subband index') 115 | -------------------------------------------------------------------------------- /estimate_cdr_nodiffuse.m: -------------------------------------------------------------------------------- 1 | %ESTIMATE_CDR_NODIFFUSE 2 | % Unbiased estimation of the Coherent-to-Diffuse Ratio (CDR) from the complex 3 | % coherence of a mixed (noisy) signal, without assuming knowledge of the noise 4 | % coherence. Equivalent to CDRprop4 in [1]. 5 | % 6 | % CDR = estimate_cdr_nodiffuse(X, NaN, S) 7 | % X: complex coherence of mixed (noisy) signal 8 | % NaN: second argument is unused 9 | % S: coherence of signal component (magnitude one) 10 | % 11 | % Reference: 12 | % Andreas Schwarz, Walter Kellermann, "Coherent-to-Diffuse Power Ratio 13 | % Estimation for Dereverberation", IEEE/ACM Trans. on Audio, Speech and 14 | % Lang. Proc., 2015 (under review); preprint available: arXiv:1502.03784 15 | % PDF: http://arxiv.org/pdf/1502.03784 16 | % 17 | % Andreas Schwarz (schwarz@lnt.de) 18 | % Multimedia Communications and Signal Processing 19 | % Friedrich-Alexander-Universitaet Erlangen-Nuernberg (FAU) 20 | % Cauerstr. 7, 91058 Erlangen, Germany 21 | function CDR = estimate_cdr_nodiffuse(Cxx,~,Css) 22 | Css = bsxfun(@times, ones(size(Cxx)), Css); 23 | 24 | % limit the magnitude of Cxx to prevent numerical problems 25 | magnitude_threshold = 1-1e-10; 26 | critical = abs(Cxx)>magnitude_threshold; 27 | Cxx(critical) = magnitude_threshold .* Cxx(critical) ./ abs(Cxx(critical)); 28 | 29 | CDR = imag(Cxx)./(imag(Css) - imag(Cxx)); 30 | CDR(imag(Css)./imag(Cxx)<=1) = Inf; 31 | CDR(imag(Css)./imag(Cxx)<=0) = 0; 32 | 33 | % Ensure we don't get any negative or complex results due to numerical effects 34 | CDR = max(real(CDR),0); 35 | end 36 | -------------------------------------------------------------------------------- /estimate_cdr_nodoa.m: -------------------------------------------------------------------------------- 1 | %ESTIMATE_CDR_NODOA 2 | % Blind (DOA-independent), unbiased estimation of the Coherent-to-Diffuse Ratio (CDR) 3 | % from the complex coherence of a mixed (noisy) signal. Equivalent to CDRprop3 in [1]. 4 | % 5 | % CDR = estimate_cdr_nodoa(Cxx, Cnn) 6 | % Cxx: complex coherence of mixed (noisy) signal 7 | % Cnn: coherence of noise component (real-valued) 8 | % 9 | % Reference: 10 | % Andreas Schwarz, Walter Kellermann, "Coherent-to-Diffuse Power Ratio 11 | % Estimation for Dereverberation", IEEE/ACM Trans. on Audio, Speech and 12 | % Lang. Proc., 2015 (under review); preprint available: arXiv:1502.03784 13 | % PDF: http://arxiv.org/pdf/1502.03784 14 | % 15 | % Andreas Schwarz (schwarz@lnt.de) 16 | % Multimedia Communications and Signal Processing 17 | % Friedrich-Alexander-Universitaet Erlangen-Nuernberg (FAU) 18 | % Cauerstr. 7, 91058 Erlangen, Germany 19 | function CDR = estimate_cdr_nodoa(Cxx,Cnn,~) 20 | Cnn = bsxfun(@times, ones(size(Cxx)), Cnn); % extend to dimension of Cxx 21 | 22 | % limit the magnitude of Cxx to prevent numerical problems 23 | magnitude_threshold = 1-1e-10; 24 | critical = abs(Cxx)>magnitude_threshold; 25 | Cxx(critical) = magnitude_threshold .* Cxx(critical) ./ abs(Cxx(critical)); 26 | 27 | CDR = (-(abs(Cxx).^2 + Cnn.^2.*real(Cxx).^2 - Cnn.^2.*abs(Cxx).^2 - 2.*Cnn.*real(Cxx) + Cnn.^2).^(1/2) - abs(Cxx).^2 + Cnn.*real(Cxx))./(abs(Cxx).^2-1); 28 | 29 | % Ensure we don't get any negative or complex results due to numerical effects 30 | CDR = max(real(CDR),0); 31 | end 32 | -------------------------------------------------------------------------------- /estimate_cdr_robust_unbiased.m: -------------------------------------------------------------------------------- 1 | %ESTIMATE_CDR_ROBUST_UNBIASED 2 | % Unbiased estimation of the Coherent-to-Diffuse Ratio (CDR) from the complex 3 | % coherence of a mixed (noisy) signal, using knowledge of both signal and noise 4 | % coherence. This is a variation of estimate_cdr_unbiased which shows better 5 | % performance in practice. Equivalent to CDRprop2 in [1]. 6 | % 7 | % CDR = estimate_cdr_nodiffuse(X, N, S) 8 | % X: complex coherence of mixed (noisy) signal 9 | % N: coherence of noise component (real-valued) 10 | % S: coherence of signal component (magnitude one) 11 | % 12 | % Reference: 13 | % Andreas Schwarz, Walter Kellermann, "Coherent-to-Diffuse Power Ratio 14 | % Estimation for Dereverberation", IEEE/ACM Trans. on Audio, Speech and 15 | % Lang. Proc., 2015 (under review); preprint available: arXiv:1502.03784 16 | % PDF: http://arxiv.org/pdf/1502.03784 17 | % 18 | % Andreas Schwarz (schwarz@lnt.de) 19 | % Multimedia Communications and Signal Processing 20 | % Friedrich-Alexander-Universitaet Erlangen-Nuernberg (FAU) 21 | % Cauerstr. 7, 91058 Erlangen, Germany 22 | function CDR = estimate_cdr_robust_unbiased(Cxx,Cnn,Css) 23 | Css = bsxfun(@times, ones(size(Cxx)), Css); 24 | Cnn = bsxfun(@times, ones(size(Cxx)), Cnn); 25 | 26 | % limit the magnitude of Cxx to prevent numerical problems 27 | magnitude_threshold = 1-1e-10; 28 | critical = abs(Cxx)>magnitude_threshold; 29 | Cxx(critical) = magnitude_threshold .* Cxx(critical) ./ abs(Cxx(critical)); 30 | 31 | CDR = 1./(-abs(Cnn-exp(1j*angle(Css)))./(Cnn.*cos(angle(Css))-1)).*abs((exp(-1j*angle(Css)).*Cnn - (exp(-1i*angle(Css)).*Cxx))./(real(exp(-1i*angle(Css)).*Cxx) - 1)); 32 | 33 | % Ensure we don't get any negative or complex results due to numerical effects 34 | CDR = max(real(CDR),0); 35 | end 36 | -------------------------------------------------------------------------------- /estimate_cdr_unbiased.m: -------------------------------------------------------------------------------- 1 | %ESTIMATE_CDR_UNBIASED 2 | % Unbiased estimation of the Coherent-to-Diffuse Ratio (CDR) from the complex 3 | % coherence of a mixed (noisy) signal, using knowledge of both signal and noise 4 | % coherence. Equivalent to CDRprop1 in [1]. 5 | % 6 | % CDR = estimate_cdr_nodiffuse(X, N, S) 7 | % X: complex coherence of mixed (noisy) signal 8 | % N: coherence of noise component (real-valued) 9 | % S: coherence of signal component (magnitude one) 10 | % 11 | % Reference: 12 | % Andreas Schwarz, Walter Kellermann, "Coherent-to-Diffuse Power Ratio 13 | % Estimation for Dereverberation", IEEE/ACM Trans. on Audio, Speech and 14 | % Lang. Proc., 2015 (under review); preprint available: arXiv:1502.03784 15 | % PDF: http://arxiv.org/pdf/1502.03784 16 | % 17 | % Andreas Schwarz (schwarz@lnt.de) 18 | % Multimedia Communications and Signal Processing 19 | % Friedrich-Alexander-Universitaet Erlangen-Nuernberg (FAU) 20 | % Cauerstr. 7, 91058 Erlangen, Germany 21 | function CDR = estimate_cdr_unbiased(Cxx,Cnn,Css) 22 | Css = bsxfun(@times, ones(size(Cxx)), Css); 23 | Cnn = bsxfun(@times, ones(size(Cxx)), Cnn); 24 | 25 | % limit the magnitude of Cxx to prevent numerical problems 26 | magnitude_threshold = 1-1e-10; 27 | critical = abs(Cxx)>magnitude_threshold; 28 | Cxx(critical) = magnitude_threshold .* Cxx(critical) ./ abs(Cxx(critical)); 29 | 30 | CDR = real(exp(-1j*angle(Css)).*Cnn - (exp(-1i*angle(Css)).*Cxx))./(real(exp(-1i*angle(Css)).*Cxx) - 1); 31 | % Ensure we don't get any negative or complex results due to numerical effects 32 | CDR = max(real(CDR),0); 33 | end 34 | -------------------------------------------------------------------------------- /lib/estimate_cpsd.m: -------------------------------------------------------------------------------- 1 | function [ Sx1x2 ] = estimate_cpsd(X1,X2,lambda) 2 | 3 | Sx1x2 = filter(1-lambda, [1 -lambda], X1.*conj(X2), [], 2); -------------------------------------------------------------------------------- /lib/estimate_delay_gcc_phat.m: -------------------------------------------------------------------------------- 1 | %ESTIMATE_DELAY_GCC_PHAT Delay estimation using GCC-PHAT. 2 | % 3 | % Estimates the delay between two signals using the GCC-PHAT method. 4 | % Returns the delay 5 | % in samples. 6 | % 7 | % Andreas Schwarz (andreas.schwarz@fau.de), Dec. 2014 8 | 9 | function shift = estimate_delay_gcc_phat(x1,x2) 10 | factor = 20; % oversampling (padding) factor to increase time resolution 11 | nfft=1024; 12 | window=hanning(nfft); 13 | n_overlap = nfft/2; 14 | X1 = specgram(x1,nfft,1,window,n_overlap); 15 | X2 = specgram(x2,nfft,1,window,n_overlap); 16 | 17 | delta = 10; % regularization constant 18 | norm_CPSD = mean(X1.*conj(X2),2)./mean((abs(X1.*conj(X2))+delta),2); 19 | % padding to increase time resolution of the cross-correlation function 20 | c = fftshift(ifft(norm_CPSD,factor*nfft,'symmetric')); 21 | %plot(c); 22 | 23 | [~,shift] = max(c); 24 | shift = (shift-(length(c)/2+1))/factor; 25 | -------------------------------------------------------------------------------- /lib/estimate_psd.m: -------------------------------------------------------------------------------- 1 | function [ Sxx ] = estimate_psd(X,lambda) 2 | 3 | Sxx = filter(1-lambda, [1 -lambda], abs(X).^2, [], 2); -------------------------------------------------------------------------------- /lib/filterbank/DFTAnaRealEntireSignal.m: -------------------------------------------------------------------------------- 1 | function X_out=DFTAnaRealEntireSignal(x_in,K,N,p) 2 | Lp = length(p); 3 | Lx = size(x_in,1); 4 | n_ch = size(x_in, 2); 5 | n_blocks = ceil(Lx/N); 6 | 7 | X_out = zeros([K/2+1, n_blocks, n_ch],'like',x_in); 8 | for ch_ix=1:n_ch 9 | x_tmp = x_in(:,ch_ix); 10 | x_tmp = x_tmp(:).'; 11 | x_buffer = buffer([zeros(1,N-1) x_tmp],Lp,Lp-N); 12 | x_buffer = x_buffer(Lp:-1:1,1:n_blocks); 13 | x_tmp = []; 14 | U = reshape(bsxfun(@times, x_buffer, p.'),K,ceil(Lp/K),n_blocks); 15 | x_buffer = []; 16 | V = squeeze(fft(sum(U,2),[],1)); 17 | U = []; 18 | X_out(:,:,ch_ix) = V(1:K/2+1,:); 19 | end 20 | -------------------------------------------------------------------------------- /lib/filterbank/DFTSynRealEntireSignal.m: -------------------------------------------------------------------------------- 1 | function x = DFTSynRealEntireSignal(X_in,K,N,p) 2 | 3 | Lp = length(p); 4 | x = zeros(1, N*size(X_in,2),'like',X_in); 5 | 6 | if all(X_in(:)==0) 7 | return 8 | end 9 | 10 | tdl = zeros(1,length(p),'like',X_in); 11 | 12 | % restore conjugate symmetric spectrum and apply iFFT 13 | Y = real(ifft([X_in; conj(X_in(end-1:-1:2,:))],[],1)); 14 | 15 | tmp = bsxfun(@times,repmat(Y,[ceil(Lp/K) 1]),p.'); 16 | 17 | Nzeros = zeros(1,N,'like',X_in); 18 | 19 | for i = 1:size(X_in,2) 20 | k = N*(i - 1) + 1; 21 | 22 | tdl = [Nzeros tdl(1:Lp-N)] + tmp(:,i).'; 23 | x(k:k+N-1) = (K*N)*tdl(Lp:-1:Lp-N+1); 24 | end 25 | -------------------------------------------------------------------------------- /lib/filterbank/prototype_K512_N128_Lp1024.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andreas12345/cdr-dereverb/d664225b7494bee2abd994fab2d3c07e78b86b58/lib/filterbank/prototype_K512_N128_Lp1024.mat -------------------------------------------------------------------------------- /lib/spectral_subtraction.m: -------------------------------------------------------------------------------- 1 | %SPECTRAL_SUBTRACTION Compute spectral subtraction weights. 2 | % 3 | % weights = spectral_subtraction(SNR,alpha,beta,mu,Gmin) 4 | % 5 | % alpha = 1; beta = 1; % power subtraction 6 | % alpha = 2; beta = 0.5; % magnitude subtraction 7 | % alpha = 2; beta = 1; % Wiener filter 8 | % mu: noise overestimation 9 | % Gmin: gain floor 10 | % 11 | % Andreas Schwarz (schwarz@lnt.de) 12 | % Multimedia Communications and Signal Processing 13 | % Friedrich-Alexander-Universitaet Erlangen-Nuernberg (FAU) 14 | % Cauerstr. 7, 91058 Erlangen, Germany 15 | function weights = spectral_subtraction(SNR,alpha,beta,mu,Gmin) 16 | 17 | if (nargin == 1) 18 | % default: magnitude subtraction 19 | alpha = 2; 20 | beta = 0.5; 21 | mu = 1; 22 | end 23 | 24 | if ~exist('Gmin','var') 25 | Gmin = 0.1; 26 | end 27 | 28 | SNR = max(SNR,0); 29 | weights = max(1 - (mu./(SNR + 1)).^beta, 0).^alpha; 30 | weights = max(weights,0); 31 | weights = max(sqrt(weights),Gmin); 32 | 33 | end -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Chair of Multimedia Comm. and Signal Processing, FAU Erlangen-Nürnberg 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are 6 | met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | * Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in 12 | the documentation and/or other materials provided with the distribution 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 18 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 | POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /wav/out.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andreas12345/cdr-dereverb/d664225b7494bee2abd994fab2d3c07e78b86b58/wav/out.wav -------------------------------------------------------------------------------- /wav/roomC-2m-75deg.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andreas12345/cdr-dereverb/d664225b7494bee2abd994fab2d3c07e78b86b58/wav/roomC-2m-75deg.wav --------------------------------------------------------------------------------