Skip to content

Commit 64efec8

Browse files
committed
Return delay offset from delayline() (#82)
1 parent 7c6d484 commit 64efec8

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

SFS_general/delayline.m

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
function sig = delayline(sig,dt,weight,conf)
1+
function [sig,delay_offset] = delayline(sig,dt,weight,conf)
22
%DELAYLINE implements a (fractional) delay line with weights
33
%
4-
% Usage: sig = delayline(sig,dt,weight,conf)
4+
% Usage: [sig,delay_offset] = delayline(sig,dt,weight,conf)
55
%
66
% Input parameter:
77
% sig - input signal (vector), can be in the form of [N C], or
@@ -17,7 +17,9 @@
1717
% conf - configuration struct (see SFS_config).
1818
%
1919
% Output parameter:
20-
% sig - delayed signal
20+
% sig - delayed signal
21+
% delay_offset - additional delay, added by the fractional delayline
22+
% filters to all channels. For integer delays this is 0.
2123
%
2224
% DELAYLINE(sig,dt,weight,conf) implementes a delayline, that delays the given
2325
% signal by dt samples and applies an amplitude weighting factor. The delay is
@@ -100,12 +102,15 @@
100102
switch delay.resampling
101103
case 'none'
102104
rfactor = 1.0;
105+
delay_offset = 0.0;
103106
case 'matlab'
104107
rfactor = delay.resamplingfactor;
108+
delay_offset = 0.0;
105109
sig = resample(sig,rfactor,1);
106110
case 'pm'
107111
% === Parks-McClellan linear phase FIR filter ===
108112
rfactor = delay.resamplingfactor;
113+
delay_offset = delay.resamplingorder / 2;
109114
a = [1 1 0 0];
110115
f = [0.0 0.9/rfactor 1/rfactor 1.0];
111116
b = firpm(delay.resamplingorder,f,a);
@@ -128,6 +133,7 @@
128133
case 'integer'
129134
% === Integer delays ===
130135
idt = ceil(dt); % round up to next integer delay
136+
delay_offset = delay_offset + 0;
131137
case 'lagrange'
132138
% === Lagrange polynomial interpolator ===
133139
if iseven(delay.filterorder)
@@ -138,11 +144,13 @@
138144
fdt = dt - idt; % fractional part of delays
139145
b = lagrange_filter(delay.filterorder,fdt);
140146
a = ones(1,channels);
147+
delay_offset = delay_offset + delay.filterorder / 2;
141148
case 'thiran'
142149
% === Thiran's allpass filter for maximally flat group delay ===
143150
idt = round(dt); % integer part of delays
144151
fdt = dt - idt; % fractional part of delays
145152
[b,a] = thiran_filter(delay.filterorder,fdt);
153+
delay_offset = delay_offset + delay.filterorder;
146154
case 'least_squares'
147155
% ==== Least squares interpolation filter ===
148156
idt = floor(dt); % integer part of delays
@@ -152,6 +160,7 @@
152160
b(:,ii) = general_least_squares(delay.filterorder+1,fdt(ii),0.90);
153161
end
154162
a = ones(1,channels);
163+
delay_offset = delay_offset + delay.filterorder / 2;
155164
case 'farrow'
156165
% === Farrow-structure ===
157166
% Based on the assumption, that each coefficient h(n) of the fractional
@@ -207,7 +216,8 @@
207216
%% ===== Postprocessing ==================================================
208217
% --- Downsampling ---
209218
if rfactor~=1
210-
sig = sig(1:rfactor:samples,:);
219+
sig = sig(1:rfactor:samples,:);
220+
delay_offset = delay_offset ./ rfactor;
211221
end
212222
% --- Undo reshape ---
213223
% [N M*C] => [M C N]

SFS_time_domain/driving_function_imp_wfs.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,6 @@
145145
% delay them. NOTE: this can be changed by the conf.N setting
146146
d_proto = repmat([row_vector(pulse) zeros(1,N-length(pulse))]',1,size(x0,1));
147147
% Shift and weight prototype driving function
148-
d = delayline(d_proto,delay*fs,weight,conf);
148+
[d, delayline_delay] = delayline(d_proto,delay*fs,weight,conf);
149+
% Add delay offset of delayline
150+
delay_offset = delay_offset + delayline_delay;

validation/test_delayline.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ function test_delayline()
6969
% --- Computation ---
7070
% Test all given delays
7171
for n=1:length(dt)
72-
outsig(:,n) = delayline(insig,dt(n),1,conf);
72+
[outsig(:,n), delay_offset] = delayline(insig,dt(n),1,conf);
7373
H(:,n) = freqz(outsig(:,n),1,wpi);
7474
magresp(:,n) = abs(H(:,n));
7575
uwphase(:,n)=-unwrap(angle(H(:,n)));
@@ -83,7 +83,7 @@ function test_delayline()
8383
t=t-L/2;
8484
% Phase delay
8585
subplot(2,2,1);
86-
plot(wpi2/pi,phasdel-(L/2)+1);
86+
plot(wpi2/pi,phasdel-(L/2)+1-delay_offset);
8787
title(['resample: ', resampling{:}, ', filter: ', filter{:},' - phase delay']);
8888
ylabel('phase delay');
8989
xlabel('normalized frequency');

0 commit comments

Comments
 (0)