2016-08-21 11 views
1

私はCで移動平均コードをしようとしています、私はすでにこれをmatlabで行い、動作します。私は手動でC言語にmatlabスクリプトを変換しましたが、私はいくつかの問題を抱えています。Movin Cプログラムへの平均conveting matlabスクリプト

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

int main() 
{ 
    int m = 16;        // MEDIA LENGTH 
    double x[]=0;        // X VECTOR = 0 
    double coef[]=0;       // COEF VECTOR = 0 
    double i;         // FOR COUNT VARIABLE 
    double n;         // FOR COUNT VARIABLE 
    double itera;        // LENGTH OF THE INPUT FILE 
    double aux;        // AUX VARIABLE TO MAKE THE SUM 
    double y[]=0;        // AUX VECTOR TO RECEIVE X VECTOR 
    double saida[]=0;       // OUTPUT VECTOR 
    FILE *arq;         // POINTER TO THE FILE 

    for (i = 0; i < m; i++) { 
     coef[i] = 1/m; 
    } 
    arq = fopen("sweep_100_3400.pcm", "rb"); 
    if (arq == NULL) 
    { 
     printf("ERROR WHILE OPENING THE FILE\n"); 
     return; 
    } 
    fread(*x,sizeof(double),m,arq); 
    fclose(arq); 
    itera = size_t(x); 
    for (i=0; i < itera; i++) { 
     y[0] = x[i]; 
     aux=0; 
     for (n=0; n<m; n++){ 
      aux= aux + coef[n] * y[n]; 
     } 
     saida[i]=aux; 
     for (n=m; n <2; n--){ 
      x[n] = x[n-1]; 
     } 
    } 
    arq=fopen("saida_medial_movel_c.pcm","wb"); 
    fwrite(*saida, sizeof(double),itera,arq); 
    fclose(arq); 
} 

私のコンパイラは、変数の宣言でエラーが表示されます。私は、関数freadとのfopenを使用しようとしていますとき

error: invalid initializer

とエラー:

error: incompatible type for argument 1 of 'fread'

誰かがそれが何であるかを知っていますか? MathWorks社のMATLABでのスクリプトの下

%MOVING AVERAGE EXAMPLE SCRIPT 
clear all; 
close all; 
clc; 
% DEFINES MEDIA LENGTH 
m = 16; 
%VECTOS EQUAL ZERO 
x = zeros (m,1); 
coef = zeros (m,1); 
%INITIALIZE VECTOR 
for j = 1 : m, 
     coef (j,1) = 1/m; 
end 
%READ INPUT FILE 
fid = fopen ('sweep_100_3400.pcm','rb'); 
s = fread (fid, 'int16'); 
fclose(fid); 
subplot(2,1,1); 
plot(s); 
grid on; 
title('ENTRADA DO FILTRO'); 
%PROCESS 
itera = length(s); 
sav_y = zeros (itera, 1); 
%EXECUTE PROCESS 
for j = 1 : itera, 
    x(1,1) = s (j,1); 
    %PRODUCTS SUM 
    y=0; 
    for n = 1 : m, 
     y = y + coef(n,1) * x(n,1); 
    end 
    sav_y(j,1) = y; 
    %SHIFT THE VECTOR 
    for n = m: -1 : 2, 
     x (n,1) = x(n-1,1); 
    end 
end 
%PLOT OUTPUT 
subplot (2,1,2); 
plot (sav_y); 
grid on; 
title('SAÍDA DO FLITRO'); 
%SAVE THE OUTPUT IN ANOTHER FILE 
fid = fopen('saida_mm_manual.pcm','wb'); 
fwrite(fid,sav_y,'int16'); 
fclose(fid); 

更新:デ・ファイルを読み書きするために、絶対パスして、以下の回答を使用。

パスは次のとおりです。それはコンパイルので、私はあなたのソースを修正した

enter image description here

+2

ソース、コンパイル、配列の割り当てには多くのエラーがあります。私は時間があれば固定版を投稿しようとします。 –

+0

ありがとう、私はC言語でプログラミングして以来、長い時間が経ちました。 – Mutante

答えて

2

warning: unknown escape sequence: '\D' 
warning: unknown escape sequence: '\s' 

パスの画像:arq = fopen("D:\Estudo\Univali\8º semestre\DSP\MediMovelC\MediaMovel\sweep_100_3400.pcm", "rb");

コードブロックは私に次のエラーを与えます。

それを修正するのに数分かかりましたが、あなたからの良い努力でした。あなたがmatlabをCに変換するときの主なエラー:

  • 配列は異なって動作します。
  • ループインデックスには整数を使用する必要があります
  • ポインタの使用方法がなくなってしまっています(あなたができることはreallocが必要です。 mは、二重がちょうど1.0/m
  • 入力ファイルを置く取得するには> 1の整数である場合:)
  • 1/mはゼロである。ここ

短い整数のリストである差分であり、次のようにコメントし

を0
5a6 
> #define m 16 // MEDIA LENGTH (had to put a macro to be able to define an array 
9,14c10,14 
<  int m = 16;        // MEDIA LENGTH 
<  double x[]=0;        // X VECTOR = 0 
<  double coef[]=0;       // COEF VECTOR = 0 
<  double i;         // FOR COUNT VARIABLE 
<  double n;         // FOR COUNT VARIABLE 
<  double itera;        // LENGTH OF THE INPUT FILE 
--- 
>  short *x;        // X VECTOR = 0 cannot define a resizeable array like in matlab 
>  double coef[m];       // COEF VECTOR = 0 
>  int i;         // FOR COUNT VARIABLE indices must be integers 
>  int n;         // FOR COUNT VARIABLE 
>  int itera;        // LENGTH OF THE INPUT FILE 
16,17c16,17 
<  double y[]=0;        // AUX VECTOR TO RECEIVE X VECTOR 
<  double saida[]=0;       // OUTPUT VECTOR 
--- 
>  double *y;        // AUX VECTOR TO RECEIVE X VECTOR 
>  double *saida;       // OUTPUT VECTOR 
21c21 
<   coef[i] = 1/m; 
--- 
>   coef[i] = 1.0/m; 
29c29 

... this zone has heavy edits because it was completely wrong 

> 
36c41 
<    aux= aux + coef[n] * y[n]; 
--- 
>    aux += coef[n] * y[n]; // more C-like 
44c49 
<  fwrite(*saida, sizeof(double),itera,arq); 
--- 
>  fwrite(saida, sizeof(double),itera,arq); // already a pointer 
45a51,53 
> free(saida); // free memory 
> free(y); 
> free(x); 

ここに固定コードがあります。私はそれが動作するかどうかはわかりませんが、コンパイルすることに注意してください。何かが

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



#define m 16 // MEDIA LENGTH 

int main() 
{ 
    short *x;        // X VECTOR = 0 
    double coef[m];       // COEF VECTOR = 0 
    int i;         // FOR COUNT VARIABLE 
    int n;         // FOR COUNT VARIABLE 
    int itera;        // LENGTH OF THE INPUT FILE 
    double aux;        // AUX VARIABLE TO MAKE THE SUM 
    double *y;        // AUX VECTOR TO RECEIVE X VECTOR 
    double *saida;       // OUTPUT VECTOR 
    FILE *arq;         // POINTER TO THE FILE 

    for (i = 0; i < m; i++) { 
     coef[i] = 1.0/m; 
    } 
    arq = fopen("sweep_100_3400.pcm", "rb"); 
    if (arq == NULL) 
    { 
     printf("ERROR WHILE OPENING THE FILE\n"); 
     return; 
    } 
    // compute size of file 
    fseek(arq,0,SEEK_END); 
    itera = ftell(arq)/sizeof(short); 
    rewind(arq); 

    // alloc mem for x, read the vector from input file 
    x = malloc(itera*sizeof(short)); 
    fread(x,sizeof(short),itera,arq); 
    fclose(arq); 
    // alloc mem for y 

    y = malloc(itera*sizeof(double)); 
    saida = malloc(itera*sizeof(double)); 

    for (i=0; i < itera; i++) { 
     y[0] = x[i]; 
     aux=0; 
     for (n=0; n<m; n++){ 
      aux += coef[n] * y[n]; 
     } 
     saida[i]=aux; 
     for (n=m; n <2; n--){ 
      x[n] = x[n-1]; 
     } 
    } 
    arq=fopen("saida_medial_movel_c.pcm","wb"); 
    fwrite(saida, sizeof(double),itera,arq); 
    fclose(arq); 
    free(saida); 
    free(y); 
    free(x); 
} 

私のアドバイスではなくC++を使用することですOKでない場合は、デバッガを使用しているためstd::vectorのおかげとstd::stringすることができますポートのものより迅速に、より少ないクラッシュの危険性、メモリリーク、未定義の動作と。さて、次回は...

+0

私はこのプログラムを埋め込みハードウェアに転送する必要があるので、もう一度Cを使用しました。ありがとう! – Mutante

+0

Jean、なぜプログラムが出力ファイルを作成していないのですか?何か案が? – Mutante

+1

@Mutanteあなたは絶対パスを与えることをお勧めします。使用するパスが、プログラムがコンパイルされているファイルのパス(現在のパスではないパス)と同じであることは、プログラムをコンパイルするときによくあります。これは問題ではないかもしれませんが、とにかくこれを試してみてください。 – patrik