webForumDet fria alternativet

Några funktionen vill jag ha

C/C++

7 svar · 383 visningar · startad av CoyPu

Medlem sedan apr. 200363 inlägg
Frågan#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

Medlem sedan sep. 20005 700 inlägg
#2

Det här är inget du kan använda dig av för fouriertransformeringen?
http://www.koders.com/c/fidEE435C66F2D190A553938790DA4C01279695FDF4.aspx

Medlem sedan apr. 200363 inlägg
#3

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 :)

Medlem sedan sep. 20011 086 inlägg
#4

Ett annat tips för fft är http://www.fftw.org/

För att vända på bitarna, funkar inte ~ ?

Medlem sedan juli 2002581 inlägg
#5

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.

Medlem sedan apr. 200363 inlägg
#6

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å

Medlem sedan apr. 200363 inlägg
#7

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;
}
Medlem sedan juli 2002581 inlägg
#8

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.

290 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
161 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)