/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
16 bit int til 8 bit?
Fra : Flemming Hansen


Dato : 17-01-06 19:27

hej,

Jeg sidder og prøver at gennemarbejde en 10 bit værdi ud af en AD konverter.
Men i den sidste omgang sker der noget som jeg ikke forstår. når jeg
dividerer værdien med et konstant tal gemmes værdien som 8 bit. Koden ser
således ud:

int maal(void)
{
unsigned char i, j;
int temp;
int resultat;
int slut[10];
int middel;
resultat = 0;

for(i=0; i<10; i++)
{
for(j=0; j<100; j++)
{
temp = ReadAD();
if(temp > resultat)
resultat = temp;
}
slut[i] = resultat;
}

for(i=0; i<9; i++)
{
slut[i]+= slut[i+1];
}

middel = slut[9] / 10; //
***************************************************

return middel;
}

Jeg måler amplituden af en sinus formel signal som skifter frekvens hele
tiden. For at være sikker på at vi måler peak værdien af signalet tager vi
100 målinger og sammenligner med hinanden og tager den højeste af dem, og
dette gentages 10 gange hvorefter der tages en gennemsnitsværdi. Det er
altså her, det går galt. når jeg dividerer summen af 10 16-bit resultater og
dividerer med 10 så får jeg en 8 bit værdi. Har nogen en forslag?
Slut[9] indegolder



 
 
Mogens Hansen (17-01-2006)
Kommentar
Fra : Mogens Hansen


Dato : 17-01-06 19:50


"Flemming Hansen" <fatih@ofir.dk> wrote in message
news:43cd36f1$0$78281$157c6196@dreader1.cybercity.dk...

[8<8<8<]
> Har nogen en forslag?

Hvor mange bit er en int på din platform (check det i compilerens manual
eller lav et program med sizeof(int) inden du svarer) ?

Venlig hilsen

Mogens Hansen



Flemming Hansen (17-01-2006)
Kommentar
Fra : Flemming Hansen


Dato : 17-01-06 20:09

> Hvor mange bit er en int på din platform (check det i compilerens manual
> eller lav et program med sizeof(int) inden du svarer) ?
>

Svært at svare nu, for det er et skole projekt, og al elekronik er i skolen.
Men jeg kan sige at mikroprocessoren er en PIC18F452, og jeg har lavet test
udskrivninger (HyperTerminal vha RS232), alle variabler indeholder 16 bit
værdier pånær "middel".



Igor V. Rafienko (17-01-2006)
Kommentar
Fra : Igor V. Rafienko


Dato : 17-01-06 20:08

[ Flemming Hansen ]


[ ... ]

> for(i=0; i<9; i++)
> {
> slut[i]+= slut[i+1];
> }
>
> middel = slut[9] / 10; //


Det slår meg som en interessant måte å regne gjennomsnittet på, men
det er kanskje uvesentlig.


> når jeg dividerer summen af 10 16-bit resultater og dividerer med 10
> så får jeg en 8 bit værdi.


Hva legger du i "får jeg en 8 bit verdi"? middel er alltid mindre enn
256?


> Har nogen en forslag? Slut[9] indegolder


Skulle du skrive noe mer her?





ivr
--
"...but it's HDTV -- it's got a better resolution than the real world."
       -- Fry, "When aliens attack"

Flemming Hansen (17-01-2006)
Kommentar
Fra : Flemming Hansen


Dato : 17-01-06 20:21

>
> > for(i=0; i<9; i++)
> > {
> > slut[i]+= slut[i+1];
> > }
> >
> > middel = slut[9] / 10; //
>
>
> Det slår meg som en interessant måte å regne gjennomsnittet på, men
> det er kanskje uvesentlig.

Der findes garanteret nogle bedre måder at regne det ud, men dette er en
hurtig løsning, jeg har ikke tænkt over at formulere det bedre

>
> Hva legger du i "får jeg en 8 bit verdi"? middel er alltid mindre enn
> 256?
>

Jep, den overstiger ikke 256

>
> > Har nogen en forslag? Slut[9] indegolder
>
>
> Skulle du skrive noe mer her?
>

Ja, jeg ville skrive noget, men kom i tanke om noget andet, og har bare
glemt at slette



Igor V. Rafienko (17-01-2006)
Kommentar
Fra : Igor V. Rafienko


Dato : 17-01-06 21:06

[ Flemming Hansen ]

[ ... ]

> > > for(i=0; i<9; i++)
> > > {
> > > slut[i]+= slut[i+1];
> > > }
> > >
> > > middel = slut[9] / 10; //
:
> Der findes garanteret nogle bedre måder at regne det ud, men dette
> er en hurtig løsning, jeg har ikke tænkt over at formulere det bedre
>


Så vidt jeg vet er gjennomsnittet summen av alle leddene delt på
antall ledd (eller misforstår jeg oppgaven, for at jeg forstår ikke
egentlig hva koden over regner ut?):


middel = 0;
for ( i = 0; i < 10; ++i )
middel += sum[i];
middel /= 10;


.... uten noe form for sjekking.

Det er også interessant å spørre hva slags verdier amplitudene dine
har, for å få en ide om størrelsesordenen på tallene (spesielt ift.
sizeof(int) på den aktuelle platformen).


> > Hva legger du i "får jeg en 8 bit verdi"? middel er alltid mindre
> > enn 256?
>
> Jep, den overstiger ikke 256


Akkurat, ja. Jeg anbefaler en testutskrift på alle de kritiske stedene
(dvs. der hvor du oppdaterer slut[] samt beregningene av
gjennomsnittet).





ivr
--
"...but it's HDTV -- it's got a better resolution than the real world."
       -- Fry, "When aliens attack"

Flemming Hansen (17-01-2006)
Kommentar
Fra : Flemming Hansen


Dato : 17-01-06 22:30

> > > > for(i=0; i<9; i++)
> > > > {
> > > > slut[i]+= slut[i+1];
> > > > }
> > > >
> > > > middel = slut[9] / 10; //

> Så vidt jeg vet er gjennomsnittet summen av alle leddene delt på
> antall ledd (eller misforstår jeg oppgaven, for at jeg forstår ikke
> egentlig hva koden over regner ut?):
>
>
> middel = 0;
> for ( i = 0; i < 10; ++i )
> middel += sum[i];
> middel /= 10;
>

Jo, nu kan jeg også se at der er noget der ikke hænger sammen. Jeg har vist
gjort det i omvent rækkefølge. Hvis jeg skrev slut[i+1] += slut[i] gav det
nok noget mere mening, for før har jeg forhøjet slut[i] med slut[i+1] og
værdien forblev i slut[i], næste gang tog jeg slut[i+1] som ikke indeholt
noget sum Well, en ny begynder fejl middel +=sum[i] virker meget
mere logisk. Og jeg vidste ikke middel /=10; kunne lade sig gøre. Nu har jeg
lært noget nyt, tusind tak for hjælpen, alle sammen

>
> ... uten noe form for sjekking.
>
> Det er også interessant å spørre hva slags verdier amplitudene dine
> har, for å få en ide om størrelsesordenen på tallene (spesielt ift.
> sizeof(int) på den aktuelle platformen).
>

Jeg arbejder egentlig på en lydtryksmåler. Altså PIC'en modtager lyd
signaler i forskellige frekvenser (mellem 20 Hz-20 kHz) med forskellige
amplituder. Signalet fra en mikrofon forstærkes så højest værdi fra
mikrofonen (antagelse) ligger ved 5 volt, hvilket er max værdi AD
konverteren kan tage imod. Dvs amplituden er mellem 0-5 V ved indgangen af
PIC18F452, og disse værdier udtrykkes i 10 bit.

>
> > > Hva legger du i "får jeg en 8 bit verdi"? middel er alltid mindre
> > > enn 256?
> >
> > Jep, den overstiger ikke 256
>
>
> Akkurat, ja. Jeg anbefaler en testutskrift på alle de kritiske stedene
> (dvs. der hvor du oppdaterer slut[] samt beregningene av
> gjennomsnittet).
>
>
>
>
>
> ivr
> --
> "...but it's HDTV -- it's got a better resolution than the real world."
> -- Fry, "When aliens attack"



Igor V. Rafienko (18-01-2006)
Kommentar
Fra : Igor V. Rafienko


Dato : 18-01-06 19:44

[ Flemming Hansen ]

[ ... ]

> Og jeg vidste ikke middel /=10; kunne lade sig gøre.


Det er en forkortelse for:

middel = middel / 10;

[ ... ]


> Dvs amplituden er mellem 0-5 V ved indgangen af PIC18F452, og disse
> værdier udtrykkes i 10 bit.


Moment nå. Den høyeste verdien i hvert slut[]-element er 5? I så fall
vil gjennomsnittet ikke overstige 5, og da er det iofs ikke underlig
at svaret får plass i 8 bit. Er det noe jeg misforstår med hele
regnestykket? (dvs. hvorfor skulle gjennomsnittet være større enn
255?)





ivr
--
"...but it's HDTV -- it's got a better resolution than the real world."
       -- Fry, "When aliens attack"

Kent Friis (18-01-2006)
Kommentar
Fra : Kent Friis


Dato : 18-01-06 19:57

Den 18 Jan 2006 19:44:01 +0100 skrev Igor V. Rafienko:
> [ Flemming Hansen ]
>
> [ ... ]
>
>> Og jeg vidste ikke middel /=10; kunne lade sig gøre.
>
>
> Det er en forkortelse for:
>
> middel = middel / 10;
>
> [ ... ]
>
>
>> Dvs amplituden er mellem 0-5 V ved indgangen af PIC18F452, og disse
>> værdier udtrykkes i 10 bit.
>
>
> Moment nå. Den høyeste verdien i hvert slut[]-element er 5? I så fall
> vil gjennomsnittet ikke overstige 5, og da er det iofs ikke underlig
> at svaret får plass i 8 bit. Er det noe jeg misforstår med hele
> regnestykket? (dvs. hvorfor skulle gjennomsnittet være større enn
> 255?)

Jeg tror han mener 0=0v, 1023=5v (10 bit = 0-1023).

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Benny Andersen (17-01-2006)
Kommentar
Fra : Benny Andersen


Dato : 17-01-06 20:42

On 17 Jan 2006 20:08:18 +0100, Igor V. Rafienko wrote:

> [ Flemming Hansen ]
>
>
> [ ... ]
>
>> for(i=0; i<9; i++)
>> {
>> slut[i]+= slut[i+1];
>> }
>>
>> middel = slut[9] / 10; //
>
>
> Det slår meg som en interessant måte å regne gjennomsnittet på, men
> det er kanskje uvesentlig.
LOL :) må da håbe hentydningen til at få byttet indeks udtrykkende forstås!

--
Mvh
Benny Andersen

Ukendt (19-01-2006)
Kommentar
Fra : Ukendt


Dato : 19-01-06 15:20


> Jeg arbejder egentlig på en lydtryksmåler. Altså PIC'en modtager lyd
> signaler i forskellige frekvenser (mellem 20 Hz-20 kHz) med forskellige
> amplituder.

> Jeg måler amplituden af en sinus formel signal som skifter frekvens hele
> tiden. For at være sikker på at vi måler peak værdien af signalet tager vi
> 100 målinger og sammenligner med hinanden og tager den højeste af dem, og
> dette gentages 10 gange hvorefter der tages en gennemsnitsværdi.

Og når du har amplituden af et signus signal, regner du om til en energi ?
Så på denne måde kan du lave et system der kan måle energien i dit
test-signal.

Hvis du vil kunne måle energien i et vilkårligt signal, kan jeg ikke forstå
at du ikke bare root-mean-squarer hele dynen ... ? Har I fået et oplæg, der
teoretisk retfærdiggør denne metode ?

Og lad nu være med at klynke over mips, selv en 8 bits knallert på 20 mhz
(?) kan altså godt udregne en del, hvis man tænker sig om.

tpt



Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste