summaryrefslogtreecommitdiff
path: root/2.3-1/toyApplication/tolstoy.m
diff options
context:
space:
mode:
Diffstat (limited to '2.3-1/toyApplication/tolstoy.m')
-rw-r--r--2.3-1/toyApplication/tolstoy.m64
1 files changed, 64 insertions, 0 deletions
diff --git a/2.3-1/toyApplication/tolstoy.m b/2.3-1/toyApplication/tolstoy.m
new file mode 100644
index 00000000..51f18359
--- /dev/null
+++ b/2.3-1/toyApplication/tolstoy.m
@@ -0,0 +1,64 @@
+function [yf, yt, ydiff] = tolstoy(x, h, L)
+% compute the convolution between two signals using the time-partitioned
+% overlap-save algorithm.
+% x -- signal (vector)
+% h -- impulse response (vector)
+% L -- fft size (IR frames are L/2, signal stepping is L/2 with 50% overlap)
+% yf -- result using frequency domain convolution
+% yt -- result using time domain convolution
+% ydiff -- error between yf and yt
+%
+% @author gregor heinrich :: arbylon
+% @date Nov./Dec. 2006
+
+% TODO: time-varying impulse responses.
+% TODO: trade-off calculation for frame sizes.
+
+close all
+
+% standard values
+if nargin==0
+ L = 2^5;
+ x=ones(20,1);
+ h=ones(3,1);
+ %breaks truncation rule
+ L = 2^5;
+ x=ones(112,1);
+ h=ones(38,1);
+end
+
+x = x(:);
+h = h(:);
+
+fprintf('signal length: %i, IR length: %i\n', length(x), length(h));
+fprintf('1. convolution in time domain.\n');
+tic
+yt = conv(x,h);
+t1 = toc;
+
+%plot(yt);
+%title('time-domain convolution y_t');
+%figure
+
+K = L / 2;
+
+fprintf('2. convolution in frequency domain.\n');
+fprintf('signal frame length: %i / stepping: %i, IR frame length: %i\n', L, K, K);
+
+tic
+yf = tols(x, h, L);
+t2 = toc;
+fprintf('comparison of calculation time: time-domain: %gs, freq-domain: %gs.\n', t1, t2);
+plot(yf);
+title('frequency-domain convolution y_f');
+%figure
+len = min([length(yt),length(yf)]);
+ydiff = yf(1:len)-yt(1:len);
+%plot(ydiff);
+%title('error plot y_t - y_f');
+error = sum(ydiff.^2);
+fprintf('total squared error: %g.\n', error);
+fprintf('done.\n');
+
+end % test
+