[C#] Twee bytes naar double... casten werkt niet?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Ik begrijp niet waarom dit niet werkt:
C#:
1
2
3
4
5
6
byte* pRead = buffer;
double* pWrite = left;
for (int i = 0; i < channelElements; i++)
{
  *pWrite++ = (double)((*pRead++) << 8 | (*pRead++));
}    


...en dit wel:
C#:
1
2
3
4
5
6
byte* pRead = buffer;
double* pWrite = left;
for (int i = 0; i < channelElements; i++)
{
  *pWrite++ = (double)BitConverter.ToInt16(new byte[] { *pRead++, *pRead++ }, 0);
}    


De eerste syntax lijkt mij ook gewoon correct? Help!

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 17-09 08:50
Een double is toch 64bit?

Even niets...


Acties:
  • 0 Henk 'm!

  • joostvanpinxten
  • Registratie: Maart 2007
  • Laatst online: 03-09 12:50
Heeft dit niet gewoon te maken met de volgorde van casten? Dat je er (double) voor cast, betekent niet dat je *pRead++ dan meteen een double is geworden. Dus wat er gebeurd is denk ik het volgende: de eerste byte wordt 8 bits naar links geschoven, maar dan staan er alleen nog maar nullen op, want er is geen plaats om de originele bits op te slaan. Vervolgens wordt er ge-orred met de volgende byte, die vervolgens naar een double wordt gecast. Dit is in ieder geval de instructie die ik in de bovenste zie staan. Probeer dus eens 'eerder' te casten naar een double?

edit:
@hierboven, dan nog zou het goed moeten gaan!

edit:
@hieronder, ik ben niet de TS he ;-) en ja, het zal vast makkelijker kunnen, maar ik ken heel C# niet, alleen de standaarrd-regels van het interpreteren van code

[ Voor 17% gewijzigd door joostvanpinxten op 22-01-2010 14:43 ]


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 17-09 08:50
Nog steeds snap ik niet wat je wil doen? Bytes naar double?

wat is er mis met?
C#:
1
2
byte* pRead = buffer; 
double* pWrite = BitConverter.ToDouble(pRead);

Even niets...


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Gewoon je statement opdelen. Waarom sla je die waarde niet eerst op in een short, en dan *pWrite++ = <var>; ? Dan heb je het probleem volgens mij zo gevonden...

Oneliners zijn leuk, maar als je niet zeker weet wat er gebeurt kun je het beter uitsplitsen en kijken bij welke stap het fout gaat.

[ Voor 29% gewijzigd door user109731 op 22-01-2010 14:48 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 18:39

Matis

Rubber Rocket

thijs_cramer schreef op vrijdag 22 januari 2010 @ 14:41:
Nog steeds snap ik niet wat je wil doen? Bytes naar double?

wat is er mis met?
C#:
1
2
byte* pRead = buffer; 
double* pWrite = BitConverter.ToDouble(pRead);
Wat TS volgens mij wil is twee bytes (8bit) concateneren naar een 64bits double. Waarom is me een raadsel, maar dat is volgens mij wat TS wil.

[ Voor 20% gewijzigd door Matis op 22-01-2010 14:45 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Ik zal het idee even uitleggen: ik heb een (directsound) buffer die bestaat uit bytes, waarin 16-bit data is opgeslagen, dus twee bytes per data-element. De data moet naar doubles worden omgezet om er een FFT op los te kunnen laten.

Omdat dit tienduizenden keren per seconden gebeurt zijn alle micro-optimalisaties welkom, dus probeer ik de bitconverter (en het maken van mini arrays) te vermijden.

Ik ga even wat ideeën die hier nu zijn geopperd proberen :)

edit: hmm... ik realiseer me net dat de 16-bit data ook nog signed is. Dus het casten lukt wel, maar ik krijg bogus resultaten vanwege de sign bit. Denk ik :P

[ Voor 14% gewijzigd door Bozozo op 22-01-2010 14:56 ]

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

ik realiseer me net dat de 16-bit data ook nog signed is
Dat, en wat waarschijnlijk ook niet goed gaat is dat jij de data nu benadert alsof het big-endian is, terwijl de kans groot is dat je originele data juist little-endian is opgeslagen. Je moet de 2e byte dus shiften ipv de eerste byte.

De signedness kun je oplossen door de most significant byte te interpreteren als sbyte ipv byte, of door het resultaat eerst te casten naar een short voordat je cast naar een double. En wil je niet ook dat de data tussen -1 en 1 ligt, zoals meestal met floating point wave data het geval is? Zo ja, dan zul je nog even moeten delen door 32768.0

De rest van de reacties in de topic zijn eigenlijk een beetje irrelevant :)

[ Voor 65% gewijzigd door .oisyn op 22-01-2010 15:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Ik zou inderdaad een soort parser moeten maken, rekening houdend met het format van de signed shorts in de buffer.

Maar toen probeerde ik eens om gewoon DirectSound naar een short[] te laten schrijven ipv een byte[] (iets wat met de WaveIn API, die ik eerst gebruikte, niet mag) en dat werkt gewoon xD. Dus is het probleem min of meer opgelost.

Toch bedankt voor het meedenken :)

TabCinema : NiftySplit

Pagina: 1