Archive for juni, 2010

Skisser

juni 23, 2010

Igår kväll var jag över hos en vän och drack te, lyssnade på en pre-release av Instant Remedys remix av Lost Patrol och fick prova rita med en Wacom-platta. Teet var ett riktigt gott kinesiskt te, något speciellt till smaken. Enligt säkra källor var det någon form av fermentering inblandad i framställningsmetoden, och min värd gillar det tillräckligt mycket för att tycka det är värt att inhandla det trots att det kostar fyra gånger mer än normalt te.

Det var lättare att använda Wacom-plattan än jag väntat mig, hela processen blev relativt naturlig även om man inte tittade på ”pappret” för att se vad man gjorde utan på skärmen.

Nedan ser ni de test-ark jag klarade av att åstadkomma med ritplattan

Mitt första skiss-ark

Mitt första skiss-ark

Mitt andra skiss-ark

Mitt andra skiss-ark, jag gillar det stängda ögat och fjädern

Lagom medelvärdesbildning

juni 21, 2010

I mitt arbete springer man på löpande* medelvärden titt som tätt, och de är oftast ganska enkla historier men som kan kräva mycket minne ifall en stor data mängd skall användas (dvs. medelvärdet skall bildas över en längre tid). Detta kan ställa till problem i inbyggda system där det är snålt med minne. Jag har därför designat ett litet nätt objekt för medelvärden som man kan byta uppdateringshastighet mot minneskrav utan att tappa sampel-frekvens. Systemet är jag dock inte först med utan det har till exempel använts av en kamrat som var på Alfvén-laboratoriet samtidigt som mig och det var i ärlighetens namn hon som fick mig i dessa tankegångar.

Systemet har en buffer med delmedelvärden och en buffer med sampels. Mätvärden läggs in i sampel-bufferten och när den är full medelvärdesbildas dessa och läggs in i ett element i delmedelvärdes-buffern. när man sedan vill ha medelvärdet för samtliga sampel tas ett medelvärde av de befintliga delmedelvärdena.

Minneskravet för medelvärde på de senaste 300 mätvärden går från 300 ord** till 30 + 10 ord ifall vi kan nöja oss med uppdateringar var 10:e sample.

#include <stdio.h>
#include <stdlib.h>

#define MEAN_FULL 0x08

typedef struct meanStruct {
  signed short *s;  // Sample-array
  signed short *m;  // array of sub-mean-values
  unsigned char sLen; // Number of samples before a new sub-mean is generated
  unsigned char mLen; // total number of sub-means
  unsigned char sPtr; // pointer to current sample
  unsigned char mPtr; // pointer to current mean
  unsigned char status;
} mean_t;

void meanInit(mean_t *mean, signed short *meanArr, unsigned char maLen, signed short *sampleArr, unsigned char saLen)
{
  mean->mLen = maLen;
  mean->sLen = saLen;

  mean->mPtr = 0;
  mean->sPtr = 0;

  mean->m = meanArr;
  mean->s = sampleArr;

  mean->status = 0x00;
}

void meanAddSample(mean_t *mean, signed short sample)
{
  unsigned char index;
  signed long subMean = 0;

  mean->s[mean->sPtr] = sample;

  mean->sPtr++;

  if (mean->sPtr >= mean->sLen)
  {
    mean->sPtr = 0; // reset sample pointer

    // Calculate sub-mean
    for (index = 0; index < mean->sLen; index++)
    {
      subMean += (signed long)mean->s[index];
    }
    subMean /= (signed long) mean->sLen;

    printf("mean->m[%d] = %d\n", mean->mPtr, subMean);
    mean->m[mean->mPtr] = subMean; //update subMean-array

    mean->mPtr++;
    if (mean->mPtr >= mean->mLen)
    {
      mean->status |= MEAN_FULL;
      mean->mPtr = 0;
    }
  }
}

signed short meanGet(mean_t mean)
{
  unsigned char index, stop;
  signed short sum = 0;

  if (mean.status & MEAN_FULL)
    stop = mean.mLen;
  else
    stop = mean.mPtr;
  // get mean-value from sub-means

  for (index = 0; index < stop; index++)
    sum += mean.m[index];
  if(stop > 0)
    return sum / stop;
  else
    return 0x8000; // UNDEFINED

}

int main(int argc, char *argv[])
{
  mean_t test;
  signed short means[3], samples[10], index;
  signed long compare = 0;
  meanInit(&test, means, 3, samples, 10);

  for(index = 0; index < 30; index++)
  {
    compare += index * 2;
    addSample(&test, (index * 2));
  }
  compare /= 300;
  printf("Orig: %d Test: %d\n", compare, getMean(test));

  system("PAUSE");
  return 0;
}

syntax highlighted by Code2HTML, v. 0.9.1

main()-funktionen ovan initialiserar ett medelvärdesobjekt och fyller det med data och testar det genom att jämföra medelvärdet med ett ”normalt” beräknat medelvärde.

Man borde kunna generalisera metoden ytterligare genom att lägga in ett läge som fyller ut sample buffern med Älsta-medlet / sample-bufferstorleken och räknar ut ett medel på detta som sedan ersätter det älsta medlet. Detta höjer uppdateringshastigheten om man gör lite avkall på noggranheten eftersom det älsta medlet kommer fungera som ett IIR-baserat medel istället för ett FIR-baserat (som de övriga medelvärdena använder).

Eftersom jag inte är hundra på allt detta är kommentarer, tillrättningar, förslag och buggrapporter hemskt välkomna! Förövrigt är det nog dags att jag hittar nått ställe att lägga dessa kodsnuttar, de börjar bli ett antal nu.

* löpande innebär att de x senaste mätningarna skall användas för att bilda medelvärdet

** ord kan vara 8, 16,32 eller 64 bitar stort beroende på val. I den här implementeringen är orden 16 byte stora

Köksstol nummer två

juni 16, 2010

Äntligen är mitt köksstolspar komplett, det tog ett år sedan jag påbörjade arbetet men är man ihärdig så blir det klart till sist! (och är man ofokuserad tar det tid)

Koncentration krävs när motivet förs över på stolen

Koncentration krävs när motivet förs över på stolen

För att överföra motivet används karbonpapper

För att överföra motivet används karbonpapper(TM)

Karbonpapper finns i de flesta pappershandlar men nuförtiden bakom undangömt i en källare i en föredetta toalett (med en skylt som varnar för puman på dörren).

En blek karbonkopia av vad som komma skall

En blek karbonkopia av vad som komma skall

Påbörjar snobben

Påbörjar snobben

Resultatet

Resultatet

Reslutatets kvalitet är mycket bättre än förväntat tack vare en assistent med stadig hand. Tanken var att jag skulle fota de båda stolarna tillsammans med det verkar jag ha missat, vid tillfälle uppdaterar jag det här inlägget. KEEP WATCHING THE SKIES!

Att avsluta det här projektet förde med sig en bonus, för att hitta färgen var jag tvungen att städa mitt verktygsskåp och nu kan man nästan hitta verktyg där i.

Edit: Er spaning av skyarna bär frukt!

Ett komplett, matchande par stolar

Ett komplett, matchande par stolar