% Usage: [ycomp,P] = audiocompress(y, m, r). Given a row or column vector y, % blocksize m and scaling parameter r this command applied JPEG-like % compression to the signal in blocks of size m, using the DCT and % frequency domain quantization Y_k -> r*round(Y_k/r). Simulated compressed % audio signal returned in vector "ycomp" (same dimensions as y). Fraction % of non-zero block DCT coefficients returned in "P". % If you don't have the signal processing toolbox substitute kdct() and % kidct() for dct() and idct(). function [ycomp,P] = audiocompress(y, m, r) % Get dimensions [M0,N0] = size(y); N = length(y); blocks = ceil(N/m); % Zero pad y to even blocksize. y((N+1):(m*(blocks))) = 0.0; % Reset N, set up new audio array for "compressed" signal N = m*(blocks); if M0 == 1 ycomp = zeros(1,N); else ycomp = zeros(N,1); end % DCT each block, then quantize as Y_k -> r*round(Y_k/r) s = 0; %Counter for non-zero DCT coefficients for k = 0:(blocks-1) y3 = y((k*m+1):((k+1)*m)); Y = dct(y3); Y = round(Y/(r))*r; %Quantization step. s = s + sum(abs(Y)>0); %Keep count of non-zero coefficients ycomp((k*m+1):((k+1)*m)) = idct(Y); end % Restrict back to original size ycomp = ycomp(1:max(M0,N0)); %Crude measure of compression ratio P = s/N;