-1
Unhandled exception at 0x779615de in main.exe: 0xC0000005: Access violation writing location 0x003d0038. 

wav ファイルを入力すると、エラー メッセージが表示されます。

以下はコードです。うまくいけば、アドバイスを得ることができます。ありがとうございました

fft.h

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

#define NR_END 1
#define FREE_ARG char*
#define M_PI 3.14159265358979323846264338327

static double sqrarg;
#define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg * sqrarg)
#define WINDOW(j,a,b) (1.0 - fabs((((j)-1)-(a))*(b))) //Bartlett

void nrerror(char error_text [])
/* Numerical Recipes standard error handle*/    
{
fprintf(stderr, "Numerical Recipes run time-time error...\n");
fprintf(stderr, "%s\n", error_text);
fprintf(stderr, "...now exiting to system...\n");
exit(1);
}

#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr

void four1(double data[], unsigned long nn, int isign)
{
unsigned long n,mmax,m,j,istep,i;
double wtemp, wr,wpr,wpi,wi,theta;
double tempr, tempi;

n=nn<<1;
j=1;
for(i=1;i<n;i+=2)
{
    if(j > i){
        SWAP(data[j],data[i]);
        SWAP(data[j+1],data[i+1]);
    }
    m=n >> 1;
    while (m >= 2 && j >m)
    {
        j -=m;
        m>>=1;
    }
    j +=m;
}
mmax=2;
while (n > mmax) 
{
    istep = mmax << 1;
    theta = isign*(6.28318530717959/mmax);
    wtemp=sin(0.5*theta);
    wpr = -2.0*wtemp*wtemp;
    wpi = sin (theta);
    wr=1.0;
    wi=0.0;
    for(m=1;m<mmax;m+=2)
    {
        for(i=m;i<=n;i+=istep)
        {
            j=i+mmax;
            tempr=wr*data[j]-wi*data[j+1];
            tempi=wr*data[j+1]+wi*data[j];
            data[j]=data[i]-tempr;
            data[j+i]=data[i+1]-tempi;
            data[i]+=tempr;
            data[i+1] +=tempi;
        }
            wr=(wtemp=wr)*wpr-wi*wpi+wr;
            wi=wi*wpr+wtemp*wpi+wi;
    }
        mmax = istep;
}
 }

 void realft(double data[], unsigned long n, int isign)
 {
void four1(double data[], unsigned long nm, int isign);
unsigned long i,i1,i2,i3,i4,np3;
double c1=0.5,c2,h1r,h1i,h2r,h2i;
double wr,wi,wpr,wpi,wtemp,theta;

theta=3.141592653589793/(double) (n>>1);
if(isign ==1)
{
    c2 = -0.5;
    four1(data,n>>1,1);
}
else
{
    c2=0.5;
    theta=-theta;
}
wtemp = sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);
wr=1.0+wpr;
wi=wpi;
np3=n+3;
for(i=2;i<=(n>>2);i++)
{
    i4=1+(i3=np3-(i2=1+(i1=i+i-1)));
    h1r=c1*(data[i1]+data[i3]);
    h1i=c1*(data[i2]-data[i4]);
    h2r= -c2*(data[i2]+data[i4]);
    h2i=c2*(data[i1]-data[i3]);
    data[i1]=h1r+wr*h2r-wi*h2i;
    data[i2]=h1i+wr*h2i+wi*h2r;
    data[i3]=h1r-wr*h2r+wi*h2i;
    data[i4]= -h1i+wr*h2i+wi*h2r;
    wr=(wtemp=wr)*wpr-wi*wpi+wr;
    wi=wi*wpr+wtemp*wpi+wi;
}
if(isign == 1)
{
    data[1]=(h1r=data[1])+data[2];
    data[2] = h1r-data[2];
}
else{
    data[1]=c1*((h1r=data[1])+data[2]);
    data[2]=c1*(h1r-data[2]);
    four1(data,n>>1,-1);
}
  }

考えられる問題

"n" = 8192 ですが、"i" は 4221 までしか反復しないため、エラーが発生します

for(i=m;i<=n;i+=istep)
        {
            j=i+mmax;
            tempr=wr*data[j]-wi*data[j+1];
            tempi=wr*data[j+1]+wi*data[j];
            data[j]=data[i]-tempr;
            data[j+i]=data[i+1]-tempi;
            data[i]+=tempr;
            data[i+1] +=tempi;
        }
4

1 に答える 1

0

あなたの FORTRAN-cum-C/C++ FFT コード (ヘッダーファイルにもあります!) は、配列のインデックスを 1 から開始しますが、C/C++ のインデックスは 0 から開始します。クラッシュで。

ああ、vectorまた#include <vector>. 彼らは2つの非常に異なることをします....

于 2013-11-15T03:13:09.393 に答える