diff --git a/applications/apertif/matlab/pfft.m b/applications/apertif/matlab/pfft.m
index 9d30aab8434702eccec8dc1bc3b4d7514416e6fc..de868e147de51fb3d427b3526a21b2edd64c22e7 100644
--- a/applications/apertif/matlab/pfft.m
+++ b/applications/apertif/matlab/pfft.m
@@ -23,13 +23,19 @@
 % Purpose : FFT per block of data
 % Description :
 
-function [data] = pfft(ctrl, data)
+function [out_data] = pfft(ctrl, in_data)
     % Data processing
-    dat = fft(data, ctrl.fft_size);
+    out_data = fft(in_data, ctrl.fft_size);
     
-    if ctrl.complex
-        data = dat;
-    else
+    if ~ctrl.complex
         % because we have real input, we can omit half of the fft result
-        data = dat(1:ctrl.fft_size/2);
+        out_data = out_data(1:ctrl.fft_size/2);
+    end
+
+    % Normalize output to [-1 1]
+    out_data = out_data / ctrl.gain;
+    
+    % Quantization
+    if ctrl.data_w>0
+        out_data = quantize(out_data, 1, ctrl.data_w, 'half_away');
     end
diff --git a/applications/apertif/matlab/pfir.m b/applications/apertif/matlab/pfir.m
index 73d7ce43f85c943c56b6b684bd679817818ba6b4..1f2f70d28e370374c893c95ba873862cfbeee8dd 100644
--- a/applications/apertif/matlab/pfir.m
+++ b/applications/apertif/matlab/pfir.m
@@ -26,7 +26,15 @@
 function [state, out_data] = pfir(ctrl, in_data)
     % Data processing
     for t = 1:ctrl.downsample_factor
-        [out_data(t), ctrl.Zdelays(t,:)] = filter(ctrl.coeff(t,:), 1, in_data(t), ctrl.Zdelays(t,:));   % ctrl.nof_taps coefficients and ctrl.nof_taps-1 Zdelays
+        [out_data(t), ctrl.Zdelays(t,:)] = filter(ctrl.coeff(t,:), 1, in_data(t), ctrl.Zdelays(t,:));   % range ctrl.nof_taps coefficients and range ctrl.nof_taps-1 Zdelays
+    end
+    
+    % Normalize output to [-1 1]
+    out_data = out_data / ctrl.gain;
+
+    % Quantization
+    if ctrl.data_w>0
+        out_data = quantize(out_data, 2^ctrl.scale_w, ctrl.data_w, 'half_away');
     end
     
     % Keep state for next call