2016-04-17 7 views
-1

インターネット(TFD v1と呼ばれる)の前に存在していた科学的なオーディオファイルタイプから、サンプル値の圧縮されていない簡単な生の配列をオーディオ形式に変換しています... this pageのget_signal()関数では、サンプル値がどのようにフォーマットされているのか、また、アレイから256ポイントを読み取るためにサンプルレートが必要なのはなぜですか?fscanf(ファイルポインタ、 "%d n%lg n"、sig_length、sample_rate);それをどのように解釈するのですか?

fscanf (filepointer   , "%d\n%lg\n" , sig_length, fsam  ); 
    fscanf (raw_audio_array_file,  ??  ,  256 , SRate_Float ); 


    /******************************************************* 
    * function get_signal reads signal data into sig_re from 
    * the file pointed to by filepointer. If the file is a 
    * type 2 TFD file then the imaginary part is set too. 
    * If the signal is type 1, its hilbert transform is 
    * returned in the imaginary part (sig_im). 
    ********************************************************/ 


    void get_signal (filepointer, sig_re, sig_im, fsam, sig_length) 
     FILE *filepointer; 
     double sig_re[], 
       sig_im[], 
       *fsam; 
     int *sig_length; 

    { 
     register int i; /* counter variable */ 
     int  sigtype; /* data file type */ 
     double dummy1, 
       dummy2; /* dummy temporary variables */ 


     fscanf (filepointer, "%d\n", &sigtype); 
     if (sigtype == 1) { /* Type one TFD file */ 
    fscanf (filepointer, "%d\n%lg\n", sig_length, fsam); 
    for (i = 0; i < *sig_length; i++) { 
     fscanf (filepointer, "%lg\n", &sig_re[i]); 
    } 
    analytic (sig_re, sig_im, *sig_length); 
     } 
     else { 
    if (sigtype == 2) { /* Type 2 TFD file */ 
     fprintf(stderr,"Complex signal.\n");  
     fscanf (filepointer, "%d\n%lg\n", sig_length, fsam); 
     for (i = 0; i < *sig_length; i++) { 
    fscanf (filepointer, "(%lg,%lg)\n", &sig_re[i], &sig_im[i]); 
    printf("%lg\n",sig_re[i]);  
     } 
    } 
    else { 
     fprintf (stderr, "ccg : incorrect input format.\n"); 
     exit (7); 
    } 
    fclose (filepointer); 
     } 
    } /* END OF FUNCTION get_signal */ 
+0

こんにちはPeter K、その複雑なコードの1000行のうち、それは私が問題を抱えている唯一の行です...それは、元のコードから逐語的にコピーされたコピーで、別のファイルタイプの条件を引いたものです。どうしてあなたのコードが否定的であるかを否定するのはなぜですか?)...私はfsamをSRate_floatにラベルを付け直して質問を単純化し、fsamが浮動小数点サンプルレートであることを説明しました。確かにあなたはfscanf関数を認識して理解していますか?以前は、DSPフォーラムに質問のコードを含めるように求められましたが、今はDSPフォーラムではDSPコードではないと言われています...私に教えてください。 –

+0

ご迷惑をおかけして申し訳ありません。私は以前にスタック交換でこの質問を試みました:...... fscanf(filepointer、 "%d \ n%lg \ n"、sig_length、fsam);回答者は、コードは解釈不能で、生のオーディオやTFD1ファイルが何であるのかわからず、見つけなければならないと答えた人はいなかった(生のオーディオファイルは何か? )。あなたがTFDを勉強してfscanf句を書いているのを見て、fscanfが返す配列を数値的に説明するほど親切でしょうか? –

+0

コンセンサスを避けて、ジェネラリストである人と比較して、あなたの専門的な研究の限界に驚くでしょう。あなたのコード上でopineする以前のCの権限は言った: K&R関数の宣言は、四半世紀以上の3つのISO C標準のために行っています。さらに、fscanfの戻り値をテストするのは驚きのレシピです。 - ジェンス...そして彼は私のノブの質問に答えることができませんでした。 –

答えて

2

fscanf (filepointer, "%d\n%lg\n", sig_length, fsam);は、書式文字列に従ってファイルから形式のデータを読み出すC関数fscanfを呼び出します。

この場合の書式文字列は、%d(整数)として破壊"%d\n%lg\n"、改行、%lgdouble)、及び別の改行です。したがって、基本的には、ファイルから2行を読み込みます。最初の行にはサンプルの長さが含まれ、2番目の行にはサンプルレートが含まれている必要があります。

1 
256 
44100.0 
1.0 
0.98 
0.96 
... 

最初の行はsigtypeであり、2行目と3行目は、(サンプル中)の信号長とサンプリングレートであり、残りの現代のサンプルレートを有する例として

、線は信号値である。

+0

誰かがコードを読むことができますが良いです! :-) –

+0

コマンドプロンプトからコードを実行するための実行実行引数としてユーザーがサンプルレートを入力し、その値がオーディオファイルを読み取るための変数として使用されるため、これは問題です。 Converseleyの場合、上記の例では、ファイルで指定されたサンプルレートが供給されているため、サンプルレートの元のコマンドライン引数が冗長になりますか? ...オハイオ州オッケー、それはfscanf句を使って読み込まれた後の配列の内容です。ありがとう!それでも、オーディオ配列がFFTに送信され、1,256,44100.0のタイプのヘッダーはありません。 –

関連する問題