Moderadores: andre_luis, 51
eletroinf escreveu:O que me vem em mente é adicionar ruído conhecido ao sinal analógico e depois subtrair digitalmente (Dither), como descrito aqui:
eletroinf escreveu:Pelo meu entendimento, uma das maneiras de usar o Dither é adicionar um ruído randômico com amplitude de 1/2 LSB do adc (pode ser gerado por um diodo). Este ruído faz com que o sinal oscile o suficiente para que o LSB seja ajustado de acordo com a média do ruído adicionado ao sinal que está sendo convertido. Por exemplo, se o sinal medido chega a 90 % do valor necessário para acionar o LSB, sem o ruído de 1/2 LSB, a ativação deste bit não ocorreria, enquanto com a técnica do Dither o LSB seria ativado.
Existe uma outra possibilidade, que é adicionar ruído com amplitude relativamente alta e depois subtrair ele digitalmente do sinal resultante da conversão ADC.
Seguem alguns links sobre o assunto, inclusive para documentação, neste excelente tópico!
ADC Input Noise: The Good, The Bad, and The Ugly. Is No Noise Good Noise?
https://www.analog.com/en/analog-dialog ... noise.html
Overcoming Converter Nonlinearities with Dither
https://www.analog.com/media/en/technic ... AN-410.pdf
How does Quantization Noise sound?
https://dspillustrations.com/pages/post ... sound.html
Dithering Explained: What it is, when to use it, and why it's important
http://darkroommastering.com/blog/dithering-explained/
eletroinf escreveu:Bom, eu nunca mexi com isso, por isso o que digo são algo como especulações, então:
Se estás usando um uC de 32 bit, porque não usar o ADC dele de 12 bit, fazer tudo em 16 bit? Poderia usar uma versão desses stm32103Rxxx que tem dois DAC de 12 bit.
Não imagino qual seria o racional de usar um DSP, considerando os teus relatos.
Segue mais um site que eu considero bom nesse assunto, inclusive tem um programa free para calcular filtros:
http://digitalfilter.com/enindex.html
E tem o IowaHills, que tem teoria e programas de cálculo dos filtros (tem os código fonte também):
http://www.iowahills.com/
% Interpolation method by Richard Lyons - DSP Related
% https://www.dsprelated.com/showarticle/1123.php
% Ricardo B. Morim
% 05/09/2020
clc
clear all
close all
N = 100;
L = 4;
x = int8(zeros(1, N));
u = zeros(1, N*L);
v = zeros(1, N*L);
y = zeros(1, N*L);
xp = zeros(1, N*L);
fs = 4000;
Ts = 1/fs;
% Build a signal for the example
t(1) = 0;
x(1) = sin(Ts*60*2*pi*1);
for k=2:N
t(k) = (k-1)*Ts;
x(k) = 20*sin(Ts*60*2*pi*k);
t1 = double(x(k));
t2 = double(x(k-1));
%u(k) = (x(k) - x(k-1))/L;
u(k) = (t1 - t2)/L;
end
t1(1) = 0;
ut = 0;
for k = 2:L*N
t1(k) = (k-1)*Ts;
tmp = rem(k, L);
if tmp == 0
v(k) = u(k/L);
ut = v(k);
xp(k) = x(k/L);
else
v(k) = ut;
xp(k) = xp(k-1);
end
y(k) = v(k) + y(k-1);
end
figure;
plot(t1, xp, t1, y);
legend('sampled 8 bit', 'Interpolated 4*f_0');
title('Happy Interpolation Guri');
eletroinf escreveu:Eu fiz aqui um teste com o método apresentado pelo Lyons no link que postei acima.
Veja o resultado, amostrando uma senóide com resolução de 8 bit. Código em Matlab abaixo.
- Código: Selecionar todos
% Interpolation method by Richard Lyons - DSP Related
% https://www.dsprelated.com/showarticle/1123.php
% Ricardo B. Morim
% 05/09/2020
clc
clear all
close all
N = 100;
L = 4;
x = int8(zeros(1, N));
u = zeros(1, N*L);
v = zeros(1, N*L);
y = zeros(1, N*L);
xp = zeros(1, N*L);
fs = 4000;
Ts = 1/fs;
% Build a signal for the example
t(1) = 0;
x(1) = sin(Ts*60*2*pi*1);
for k=2:N
t(k) = (k-1)*Ts;
x(k) = 20*sin(Ts*60*2*pi*k);
t1 = double(x(k));
t2 = double(x(k-1));
%u(k) = (x(k) - x(k-1))/L;
u(k) = (t1 - t2)/L;
end
t1(1) = 0;
ut = 0;
for k = 2:L*N
t1(k) = (k-1)*Ts;
tmp = rem(k, L);
if tmp == 0
v(k) = u(k/L);
ut = v(k);
xp(k) = x(k/L);
else
v(k) = ut;
xp(k) = xp(k-1);
end
y(k) = v(k) + y(k-1);
end
figure;
plot(t1, xp, t1, y);
legend('sampled 8 bit', 'Interpolated 4*f_0');
title('Happy Interpolation Guri');
Voltar para STMicroelectronics
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante