SQNR simulation result does not match with the formula 6.02*N + 1.76

조회 수: 39 (최근 30일)
Engincan Ergen
Engincan Ergen 2021년 10월 29일
답변: Arthi Sathyamurthi 2021년 12월 28일
I have implemented an ideal 10 bit midrise type quantizer in MATLAB. The signal-to-quantization-noise value from the simulation
and theory differ by approximately 6 dB. I have checked this difference with multiple bit numbers such as 10 bits, 12bits, 16bits and
the result is the same, SQNR from the simulation is always 6 dB below the ideal value. Also, fft of the quantized signal is strange, it
does have two peaks at signal frequency as expected, however all other values are zero. I cannot understand these two results.
Here is my code:
clear all;clc;close all;
fs = 1e6;
t = 0:1/fs:4.095e-3;
y1 = sin(2*pi*37/512*1e6*t);
N = length(y1);
y1_dft = abs(fft(y1))/N;
dft_idy1 = 0:N-1;
f = (fs/N)*dft_idy1;
figure (1);
plot(f,20*log10(y1_dft));
title("fft of the original signal y1");
nbits = 10;
delta = 2*max(abs(y1))/(2^nbits); %% for n bit quantization, step size(delta) is Vpp/(2^nbit)
n_quants = 2^nbits;
% following part implements a midrise quantizer
partition_right = delta:delta:(n_quants/2)*delta;
partition_left = -flip(partition_right,2);
partition = [partition_left 0 partition_right];
codebook_left = [min(partition_left) partition_left];
codebook_right = [partition_right max(partition_right)];
codebook = [codebook_left codebook_right];
[index,y1_quantized] = quantiz(y1,partition,codebook);
%quantized_y1 = floor((n_quants-1)*y1)/(n_quants);
figure(2);
plot(t,y1);
hold on
stem(t,y1_quantized);
legend('Original signal y1','Quantized y1');
hold off
quants_dft = abs(fft(y1_quantized))/N;
dft_idquants = 0:N-1;
f = (fs/N)*dft_idquants;
figure(3);
plot(f,(quants_dft));
title("fft of the quantized signal");
quantization_noise = y1 - y1_quantized;
figure
plot(t,quantization_noise);
xlabel('time')
ylabel('quantization noise')
title('quantization noise in time domain')
quantization_noise_power = sum(abs(quantization_noise).^2)/N;
quantization_noise_power_theory = (delta^2)/12;
signal_power = var(y1);
SQNR_sim = 10*log10(signal_power/quantization_noise_power);
SQNR_theory = 6.02*nbits + 1.76 % in dB

답변 (1개)

Arthi Sathyamurthi
Arthi Sathyamurthi 2021년 12월 28일
Hello,
The theoritical SQNR formula is where is the signal power in dB and ν is the number of bits. Hence you can try modifying the SQNR theory as
SQNR_theory = 10*log10(signal_power) + 6.02*nbits + 1.76;
Also to calculate the power of the signal you can use the bandpower function.

카테고리

Help CenterFile Exchange에서 Signal Attributes and Indexing에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by