Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 需要帮助使这个程序计算PSD吗_C_Signal Processing_Fftw - Fatal编程技术网

C 需要帮助使这个程序计算PSD吗

C 需要帮助使这个程序计算PSD吗,c,signal-processing,fftw,C,Signal Processing,Fftw,我试图制作一个程序来计算时间序列(16384个样本)的PSD,比如一个窦,代码如下: // generating sin samples #include <stdio.h> #include <math.h> #include <complex.h> int main(){ FILE *inp =NULL,*inp2; double value = 0.0; float frequency = 1; // signal fre

我试图制作一个程序来计算时间序列(16384个样本)的PSD,比如一个窦,代码如下:

// generating sin samples 

#include <stdio.h>
#include <math.h>
#include <complex.h>

int main(){
    FILE *inp =NULL,*inp2;
    double value = 0.0; 
    float frequency = 1; // signal frequency 
    double timeSec = 1 ; // time in sec 
    unsigned int  numberOFSamples = 2048*8;
    double steps = timeSec / numberOFSamples; 
    double timer =0.0;
    float  dcValue =0.0;
    double index = 0;
     inp = fopen("sinus","wb+");
     inp2= fopen("sinusD","wb+");
    for( timer=0.0 ; timer<timeSec;timer+=steps){
        value= sin(2*M_PI*frequency*timer) +dcValue;
        fprintf(inp,"%lf ",value);
        fwrite(&value,sizeof(double),1,inp2);

     }

     fclose(inp);
     fclose(inp2);
     return 0;

}
    #include <fftw3.h>
#include <math.h>
#include <stdio.h>
#include <complex.h>

#define WINDOW_SIZE 1024

int main (){
  FILE* inputFile = NULL;
  FILE* outputFile= NULL;
  double* inputData=NULL; 
  double* outputData=NULL;
  double* windowData=NULL;
  unsigned int windowSize = 1024;
  int overlaping =0;
  int index1 =0,index2=0, i=0;
  double powVal= 0.0;
  fftw_plan plan_r2hc;
  double w[WINDOW_SIZE];
  for (i=0; i<WINDOW_SIZE; i++) {
  w[i] = (1.0 - cos(2.0 * M_PI * i/(WINDOW_SIZE-1))) * 0.5;  // hann window
  }

// mememory allocation
  inputData = (double*) fftw_malloc(sizeof(double)*windowSize);
  outputData= (double*) fftw_malloc(sizeof(double)*windowSize);
  windowData= (double*) fftw_malloc(sizeof(double)*windowSize);
  plan_r2hc = fftw_plan_r2r_1d(windowSize, inputData, windowData, FFTW_R2HC, FFTW_PATIENT);
  // Opning files 
  inputFile = fopen("sinusD","rb");
  outputFile= fopen("windowingResult","wb+");
  if(inputFile==NULL ){
    printf("Couldn't open either the input or the output file \n");
    return -1;
  }

  while((i=fread(inputData,sizeof(double),windowSize,inputFile))==windowSize){   

    for( index1 =0; index1 < WINDOW_SIZE;index1++){
      inputData[index1]*=w[index1];
    //  printf("index %d \t %lf\n",index1,inputData[index1]);
    }
     fftw_execute_r2r(plan_r2hc, inputData, windowData);
     for( index1 =0; index1 < windowSize;index1++){
          outputData[index1]+=windowData[index1];
     }
     if(overlaping!=0)
      fseek(inputFile,(-overlaping)*sizeof(double),SEEK_CUR);
  }
  if( i!=0){
     i = -i;
    fseek(inputFile ,i*sizeof(double),SEEK_END);
    fread(inputData,sizeof(double),-i,inputFile);
    for( index1 =0; index1 < -i;index1++){
      inputData[index1]*=(1.0 - cos(2.0 * M_PI * index1/(windowSize-1)) * 0.5);
    //  printf("index %d \t %lf\n",index1,inputData[index1]);
    }
     fftw_execute_r2r(plan_r2hc, inputData, windowData);
     for( index1 =0; index1 < windowSize;index1++){
          outputData[index1]+=windowData[index1];
     }

  }


  powVal = outputData[0]*outputData[0];
  powVal /= (windowSize*windowSize)/2;
  index1 = 0;
  fprintf(outputFile,"%lf ",powVal);
  printf(" PSD \t %lf\n",powVal);
  for (index1 =1; index1<=windowSize;index1++){
            powVal = outputData[index1]*outputData[index1]+outputData[windowSize-index1]*outputData[windowSize- index1];
            powVal/=(windowSize*windowSize)/2;
          //  powVal = 20*log10(fabs(powVal));
            fprintf(outputFile,"%lf ",powVal);
            printf(" PsD %d \t %10.5lf\n",index1,powVal);
    }


  fftw_free(inputData);
  fftw_free(outputData);
  fftw_free(windowData);
  fclose(inputFile);
  fclose(outputFile);
}

导入
c
程序的结果后,PSD相同,但比例不同:


正如您所见,比例不同。

未初始化
outputData[]
的元素

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
建议:

outputData = fftw_malloc(sizeof(double)*windowSize);
for (index1 =0; index1 < windowSize; index1++) {
  outputData[index1] = 0.0;
}
...
  outputData[index1] += ...
outputData=fftw\u malloc(sizeof(double)*windowSize);
对于(index1=0;index1
未初始化
输出数据[]
的元素

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
建议:

outputData = fftw_malloc(sizeof(double)*windowSize);
for (index1 =0; index1 < windowSize; index1++) {
  outputData[index1] = 0.0;
}
...
  outputData[index1] += ...
outputData=fftw\u malloc(sizeof(double)*windowSize);
对于(index1=0;index1
未初始化
输出数据[]
的元素

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
建议:

outputData = fftw_malloc(sizeof(double)*windowSize);
for (index1 =0; index1 < windowSize; index1++) {
  outputData[index1] = 0.0;
}
...
  outputData[index1] += ...
outputData=fftw\u malloc(sizeof(double)*windowSize);
对于(index1=0;index1
未初始化
输出数据[]
的元素

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
建议:

outputData = fftw_malloc(sizeof(double)*windowSize);
for (index1 =0; index1 < windowSize; index1++) {
  outputData[index1] = 0.0;
}
...
  outputData[index1] += ...
outputData=fftw\u malloc(sizeof(double)*windowSize);
对于(index1=0;index1
如chux所述,
outputData
数组的元素未初始化

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
此外,使用以下方法获得的功率谱密度估计值应平均频谱值的功率(而不是计算平均值的功率):

最后,如果频谱缩放对您的应用非常重要(即,如果您需要的频率分量的相对强度之外),则还应将窗口效应考虑到归一化因子中,如中所述:

或者,要缩放
pHelp
输出以匹配C程序中使用的定义:

% For arbitrary sampling_rate:
%[output,f] = pwelch(input,hann(8192),[],[],sampling_rate)/(8192*sampling_rate);
% which simplifies to the following by setting sampling_rate = 1
[output,f] = pwelch(input,hann(8192))/8192;
plot(output);

正如chux提到的,
outputData
数组的元素没有初始化

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
此外,使用以下方法获得的功率谱密度估计值应平均频谱值的功率(而不是计算平均值的功率):

最后,如果频谱缩放对您的应用非常重要(即,如果您需要的频率分量的相对强度之外),则还应将窗口效应考虑到归一化因子中,如中所述:

或者,要缩放
pHelp
输出以匹配C程序中使用的定义:

% For arbitrary sampling_rate:
%[output,f] = pwelch(input,hann(8192),[],[],sampling_rate)/(8192*sampling_rate);
% which simplifies to the following by setting sampling_rate = 1
[output,f] = pwelch(input,hann(8192))/8192;
plot(output);

正如chux提到的,
outputData
数组的元素没有初始化

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
此外,使用以下方法获得的功率谱密度估计值应平均频谱值的功率(而不是计算平均值的功率):

最后,如果频谱缩放对您的应用非常重要(即,如果您需要的频率分量的相对强度之外),则还应将窗口效应考虑到归一化因子中,如中所述:

或者,要缩放
pHelp
输出以匹配C程序中使用的定义:

% For arbitrary sampling_rate:
%[output,f] = pwelch(input,hann(8192),[],[],sampling_rate)/(8192*sampling_rate);
% which simplifies to the following by setting sampling_rate = 1
[output,f] = pwelch(input,hann(8192))/8192;
plot(output);

正如chux提到的,
outputData
数组的元素没有初始化

outputData = (double*) fftw_malloc(sizeof(double)*windowSize);
...
  outputData[index1] += ...
此外,使用以下方法获得的功率谱密度估计值应平均频谱值的功率(而不是计算平均值的功率):

最后,如果频谱缩放对您的应用非常重要(即,如果您需要的频率分量的相对强度之外),则还应将窗口效应考虑到归一化因子中,如中所述:

或者,要缩放
pHelp
输出以匹配C程序中使用的定义:

% For arbitrary sampling_rate:
%[output,f] = pwelch(input,hann(8192),[],[],sampling_rate)/(8192*sampling_rate);
% which simplifies to the following by setting sampling_rate = 1
[output,f] = pwelch(input,hann(8192))/8192;
plot(output);

最好的办法是在调试器中运行代码,调试器将一步一步地运行它。在运行时检查变量的值,并查看它何时开始“出错”。任何复杂的代码都会从错误开始,因此如果没有基本的调试技术,你不可能得到像这样的工作。代码的工作方式就是我使用窗口的方式,fft是我的问题。最好的办法是在调试器中运行代码,它会一步一步地运行。在运行时检查变量的值,并查看它何时开始“出错”。任何复杂的代码都会从错误开始,因此如果没有基本的调试技术,你不可能得到像这样的工作。代码的工作方式就是我使用窗口的方式,fft是我的问题。最好的办法是在调试器中运行代码,它会一步一步地运行。在运行时检查变量的值,并查看它何时开始“出错”。任何复杂的代码都会从错误开始,因此如果没有基本的调试技术,你不可能得到像这样的工作。代码的工作方式就是我使用窗口的方式,fft是我的问题。最好的办法是在调试器中运行代码,它会一步一步地运行。在运行时检查变量的值,并查看它何时开始“出错”。任何复杂的代码都会从错误开始,因此如果没有基本的调试技术,你不可能得到像这样的工作。代码的工作方式与我使用窗口的方式相同,fft是我的问题谢谢你的回答,我通过初始化outputData向量更改了代码,但这并没有改变结果,你的答案是相同的,我改变了代码,初始化outputData向量但结果没有改变,你的答案是相同的,我改变了代码,初始化outputData向量但结果没有改变,你的答案是相同的,我改变了代码,通过初始化outputData向量,但这并没有改变结果,这与您的答案非常相似,我不完全理解,但我在bunch上进行了测试