C CoyPu Medlem sedan apr. 2003 63 inlägg Frågan 5 apr. 2005 10:27 #1 Hej!
Jag begöver hitta en funktion som utför komplex FFT på en array med samplade värden (doubles).
Sen skulle jag vilja ha en funktion som vänder på bitarna i ett ord. Tex 010011 -> 110010.
Finns det någon som har en sådan eller vet vart man kan hitta dessa funktioner skrivna i c.
//Christer
Gein Medlem sedan sep. 2000 5 700 inlägg C CoyPu Medlem sedan apr. 2003 63 inlägg Vid en snabb blick så ser det mkt bra ut. skall sätta mig och kolla koden närmare i kväll :)
Tack så mkt :)
P pimme Medlem sedan sep. 2001 1 086 inlägg Ett annat tips för fft är http://www.fftw.org/
För att vända på bitarna, funkar inte ~ ?
pimme skrev:
För att vända på bitarna, funkar inte ~ ?
Nej.
Jag kommer inte på något smart och smidigt sätt att vända på bitarna, så det blir nog till att manuellt flytta omkring dem.
C CoyPu Medlem sedan apr. 2003 63 inlägg
Nej.
Jag kommer inte på något smart och smidigt sätt att vända på bitarna, så det blir nog till att manuellt flytta omkring dem.
Då e det inte bara jag som har kommiit fram till detta. fråga för att hoppas att någon skulle komma på nått bra sätt... men då får jag skriva en själv som slänger runt bitarna..
Tack ändå
C CoyPu Medlem sedan apr. 2003 63 inlägg Om någon skulle behöva den koden som "vänder" på bitarna så kommer den här :) hittad på nätet :)
#include <stdio.h>
#include <math.h>
#define SBYTE 8
#define SSBYTE 16
#define IBYTE 32
void ByteShift(int);
void ShortByteShift(short);
void IntShift(int);
int main()
{
int nNum;
printf("Enter a number:");
scanf("%d", &nNum);
if (nNum <= 255) {
printf("The nNum is 1 byte..\n");
ByteShift(nNum);
}
else if (nNum <= 65535) {
ShortByteShift(nNum);
printf("The nNum is 2 byte...\n");
}
else{
IntShift(nNum);
printf("The nNum is 4 byte..\n");
}
return 0;
}
void ByteShift(int nVal)
{
int nLoop;
int nShift;
int nRes;
int nCount;
int nTmp;
int nValue;
nTmp = 0;
nRes = 0;
nValue = nVal;
for(nLoop=0;nLoop<SBYTE;nLoop++)
{
nCount=nLoop+1;
nTmp=(int)pow(2,nLoop);
nTmp &= nValue;
if (nTmp > 0) {
nShift = 0;
nShift = SBYTE - (nLoop + nCount);
if(nShift > 0)
nTmp = nTmp << nShift;
else
nTmp = nTmp >> abs(nShift);
nRes |= nTmp;
}
}
printf("Value is : %d\n", nRes);
}
void ShortByteShift(short sVal)
{
int nLoop;
int nShift;
int nRes;
int nCount;
int nTmp;
int nValue;
nTmp = 0;
nRes = 0;
nValue = sVal;
for(nLoop=0;nLoop<SSBYTE;nLoop++)
{
nCount=nLoop+1;
nTmp=(int)pow(2,nLoop);
nTmp &= nValue;
if (nTmp > 0) {
nShift = 0;
nShift = SSBYTE - (nLoop + nCount);
if(nShift > 0)
nTmp = nTmp << nShift;
else
nTmp = nTmp >> abs(nShift);
nRes |= nTmp;
}
}
printf("Value is : %d\n", nRes);
return;
}
void IntShift(int nVal)
{
int nLoop;
int nShift;
int nRes;
int nCount;
int nTmp;
int nValue;
nTmp = 0;
nRes = 0;
nValue = nVal;
for(nLoop=0;nLoop<IBYTE;nLoop++)
{
nCount=nLoop+1;
nTmp=(int)pow(2,nLoop);
nTmp &= nValue;
if (nTmp > 0) {
nShift = 0;
nShift = IBYTE - (nLoop + nCount);
if(nShift > 0)
nTmp = nTmp << nShift;
else
nTmp = nTmp >> abs(nShift);
nRes |= nTmp;
}
}
printf("Value is : %d\n", nRes);
return;
}
Det var en konstig kod du hittade, en massa onödiga variabler som inte behövs och varför sätta nShift till 0 för att på raden efter ändra på den?
I C++ löser man det snabbt och lätt för alla typer med typmallar:
template<typename T> T mirror(T tal)
{
T val=0;
for (int p=0;p<8*sizeof T;++p)
val |= ((tal & (1<<p))!=0?1:0) << 8*sizeof T-p-1;
return val;
}
Vill du använda C får du plocka bort template<> och byta ut T mot den typ som önskas.