Пример #1
0
main()
{
  MONO_PCM pcm;
  int n, i;
  double a, f0;
  pcm.fs = 44100; /* 標本化周波数 */
  pcm.bits = 16; /* 量子化精度 */
  pcm.length = pcm.fs * 5; /* 音の長さは5秒 441000 */
  pcm.s = calloc(pcm.length, sizeof(double)); /* メモリを確保 */

  a = 0.2;
  f0 = 440.0;
  pcm.s[0] = a;
  for(n = 1; n < pcm.length;) /* n = 0 ~ 441000 */
  {
    for(i = 0; i < pcm.fs / (2 * f0) &&  n < pcm.length; i++, n++)
    {
      pcm.s[n] = pcm.s[n - 1] - 4 * a * f0 / pcm.fs;
    }

    for(i = 0; i < pcm.fs / (2 * f0) &&  n < pcm.length; i++, n++)
    {
      pcm.s[n] = pcm.s[n - 1] + 4 * a * f0 / pcm.fs;
    }
  }

  mono_wave_write(&pcm, "440hz_triangle.wav");

  free(pcm.s);
}
Пример #2
0
int main(void)
{
  MONO_PCM pcm1;
  int n, i;
  double A, f0;
  
  pcm1.fs = 8000; /* 標本化周波数 */
  pcm1.bits = 16; /* 量子化精度 */
  pcm1.length = 8000; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  
  A = 0.25; /* 振幅 */
  f0 = 250.0; /* 基本周波数 */
  
  /* 矩形波 */
  for (n = 0; n < pcm1.length; n++)
  {
    for (i = 1; i <= 15; i++) /* 15倍音までの重ね合わせ */
    {
      if (i % 2 == 1) /* 奇数次の倍音のみ重ね合わせる */
      {
        pcm1.s[n] += A / i * sin(2.0 * M_PI * f0 * i * n / pcm1.fs);
      }
    }
  }
  
  mono_wave_write(&pcm1, "ex2_3.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm1.s); /* メモリの解放 */
  
  return 0;
}
Пример #3
0
int main(void)
{
  MONO_PCM pcm0, pcm1;
  int n, m, d, I, J;
  double fc, Q, depth, rate, a[3], b[3];
  
  mono_wave_read(&pcm0, "sample04.wav"); /* WAVEファイルからモノラルの音データを入力する */
  
  pcm1.fs = pcm0.fs; /* 標本化周波数 */
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = pcm0.length; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  
  I = 2; /* 遅延器の数 */
  J = 2; /* 遅延器の数 */
  
  depth = 800.0; /* 800Hz */
  rate = 1.0; /* 1Hz */
  
  /* ワウ */
  for (n = 0; n < pcm1.length; n++)
  {
    fc = (1000.0 + depth * sin(2.0 * M_PI * rate * n / pcm1.fs)) / pcm1.fs; /* 中心周波数 */
    Q = 2.0; /* クオリティファクタ */
    
    IIR_resonator(fc, Q, a, b); /* IIRフィルタの設計 */
    
    for (m = 0; m <= J; m++)
    {
      if (n - m >= 0)
      {
        pcm1.s[n] += b[m] * pcm0.s[n - m];
      }
    }
    for (m = 1; m <= I; m++)
    {
      if (n - m >= 0)
      {
        pcm1.s[n] += -a[m] * pcm1.s[n - m];
      }
    }
  }
  
  mono_wave_write(&pcm1, "ex7_3.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm0.s); /* メモリの解放 */
  free(pcm1.s); /* メモリの解放 */
  
  return 0;
}
Пример #4
0
int main(void)
{
  MONO_PCM pcm0, pcm1;
  int n;
  double gain, level;
  
  mono_wave_read(&pcm0, "sample02.wav"); /* WAVEファイルからモノラルの音データを入力する */
  
  pcm1.fs = pcm0.fs; /* 標本化周波数 */
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = pcm0.length; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  
  gain = 10.0; /* 増幅率 */
  level = 0.5; /* レベル */
  
  for (n = 0; n < pcm1.length; n++)
  {
    if (pcm0.s[n] < 0.0)
    {
      pcm0.s[n] *= -1.0; /* 音データの全波整流 */
    }
    
    pcm1.s[n] = pcm0.s[n] * gain; /* 音データの増幅 */
    
    if (pcm1.s[n] > 1.0)
    {
      pcm1.s[n] = 1.0; /* クリッピング */
    }
    else if (pcm1.s[n] < -1.0)
    {
      pcm1.s[n] = -1.0; /* クリッピング */
    }
    
    pcm1.s[n] *= level; /* 音の大きさを調節する */
  }
  
  mono_wave_write(&pcm1, "ex4_3.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm0.s); /* メモリの解放 */
  free(pcm1.s); /* メモリの解放 */
  
  return 0;
}
Пример #5
0
int main(void)
{
  MONO_PCM pcm0, pcm1;
  int n, m, J, offset;
  double t, pitch;
  
  //mono_wave_read(&pcm0, "sample12.wav"); /* WAVEファイルからモノラルの音データを入力する */
  mono_wave_read(&pcm0, "/home/akihabara/C_de_hajimeru/chapter02/guitar_A4.wav");

  //pitch = 1.5; /* 音の高さを1.5倍にする */
  pitch = 2.0;
  pcm1.fs = pcm0.fs; /* 標本化周波数の変更 */
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = (int)(pcm0.length / pitch); /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  
  J = 24;
  
  for (n = 0; n < pcm1.length; n++)
  {
    t = pitch * n;
    offset = (int)t;
    for (m = offset - J / 2; m <= offset + J / 2; m++)
    {
      if (m >= 0 && m < pcm0.length)
      {
        pcm1.s[n] += pcm0.s[m] * sinc(M_PI * (t - m));
      }
    }
  }
  
  mono_wave_write(&pcm1, "ex12_2.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm0.s); /* メモリの解放 */
  free(pcm1.s); /* メモリの解放 */
  
  return 0;
}
Пример #6
0
int main(void)
{
  MONO_PCM pcm0, pcm1;
  int n;
  
  //mono_wave_read(&pcm0, "a.wav"); /* WAVEファイルからモノラルの音データを入力する */
  mono_wave_read(&pcm0, "/home/akihabara/C_de_hajimeru/chapter02/guitar_A4.wav");
  pcm1.fs = pcm0.fs; /* 標本化周波数 */
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = pcm0.length; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  for (n = 0; n < pcm1.length; n++)
  {
    pcm1.s[n] = pcm0.s[n]; /* 音データのコピー */
    printf("%d %f\n",n,pcm1.s[n]);
  }
  
  //mono_wave_write(&pcm1, "b.wav"); /* WAVEファイルにモノラルの音データを出力する */
  mono_wave_write(&pcm1,"b_another.wav");
  free(pcm0.s); /* メモリの解放 */
  free(pcm1.s); /* メモリの解放 */
  
  return 0;
}
int main(void)
{
  MONO_PCM pcm00, pcm0, pcm1;
  int n, k, N, offset, frame, number_of_frame;
  double threshold, *w, *x_real, *x_imag, *A, *T, *y_real, *y_imag;
 
  double *x2_real,*x2_imag,*A2,*T2,*y2_real,*y2_imag;
  double *y3_real,*y3_imag;
  
  FILE *fp;
  char tring = k;
  char *fname = "result.dat";
  fp = fopen( fname, "w" );

  mono_wave_read(&pcm00,"grouwl.wav"); 
  mono_wave_read(&pcm0,"sample.wav");
  //mono_wave_read(&pcm0,"hajimemasite.wav");


  N = 4096;
  N = 16384;
  N = 32768;
  N = 44000;
  w = calloc(N, sizeof(double)); /* メモリの確保 */
  x_real = calloc(N, sizeof(double)); /* メモリの確保 */
  x_imag = calloc(N, sizeof(double)); /* メモリの確保 */
  A = calloc(N, sizeof(double)); /* メモリの確保 */
  T = calloc(N, sizeof(double)); /* メモリの確保 */
  y_real = calloc(N, sizeof(double)); /* メモリの確保 */
  y_imag = calloc(N, sizeof(double)); /* メモリの確保 */
  
  x2_real = calloc(N, sizeof(double)); /* メモリの確保 */
  x2_imag = calloc(N, sizeof(double)); /* メモリの確保 */
  A2 = calloc(N, sizeof(double)); /* メモリの確保 */
  T2 = calloc(N, sizeof(double)); /* メモリの確保 */
  y2_real = calloc(N, sizeof(double)); /* メモリの確保 */
  y2_imag = calloc(N, sizeof(double)); /* メモリの確保 */
 
  y3_real = calloc(N, sizeof(double)); /* メモリの確保 */
  y3_imag = calloc(N, sizeof(double)); /* メモリの確保 */

  Hanning_window(w,N);
  number_of_frame = (pcm0.length - N / 2) / (N / 2);
  
  pcm1.fs = pcm0.fs;
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = pcm0.length; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */

    for (n = 0; n < N; n++)
    {
      //x_real[n] = pcm00.s[n+33000];
      x_real[n] = pcm00.s[n];
      x_imag[n] = 0.0;
    }
    FFT(x_real,x_imag,N);
    
    for (k = 0; k < N; k++)
      {
        A[k] = sqrt(x_real[k] * x_real[k] + x_imag[k] * x_imag[k]);
        if (x_imag[k] != 0.0 && x_real[k] != 0.0)
        {
          T[k] = atan2(x_imag[k], x_real[k]);
        }
        
        printf("%d %f %f\n",k,A[k],T[k]);
        
      }
      /* スペクトルサブトラクション */
      for (k = 0; k < N; k++)
      {
        A[k] -= threshold;
        if (A[k] < 0.0)
        {
          A[k] = 0.0;
       }
      }
      
      for (k = 0; k < N; k++)
      {
        y_real[k] = A[k] * cos(T[k]);
       y_imag[k] = A[k] * sin(T[k]);
      }
      IFFT(y_real,y_imag,N);
      
      for(k=0;k<N;k++) {
        pcm1.s[k] = y_real[k];
      }

  mono_wave_write(&pcm1, "ffttry.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm0.s); /* メモリの解放 */
  free(pcm00.s);
  free(pcm1.s); /* メモリの解放 */
  free(w); /* メモリの解放 */
  free(x_real); /* メモリの解放 */
  free(x_imag); /* メモリの解放 */
  free(A); /* メモリの解放 */
  free(T); /* メモリの解放 */
  free(y_real); /* メモリの解放 */
  free(y_imag); /* メモリの解放 */

  fclose(fp);
  free(x2_real);
  free(x2_imag);
  free(A2);
  free(T2);
  free(y2_real);
  free(y2_imag);

  free(y3_real);
  free(y3_imag);
  return 0;
}
Пример #8
0
int main(void)
{
  MONO_PCM pcm0, pcm1;
  int n, k, N, offset, frame, number_of_frame;
  double threshold, *w, *x_real, *x_imag, *A, *T, *y_real, *y_imag;
  
  mono_wave_read(&pcm0, "sample10.wav"); /* WAVEファイルからモノラルの音データを入力する */
  
  pcm1.fs = pcm0.fs; /* 標本化周波数 */
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = pcm0.length; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  
  threshold = 0.5; /* しきい値 */
  
  N = 1024; /* DFTのサイズ */
  
  number_of_frame = (pcm0.length - N / 2) / (N / 2); /* フレームの数 */
  
  w = calloc(N, sizeof(double)); /* メモリの確保 */
  x_real = calloc(N, sizeof(double)); /* メモリの確保 */
  x_imag = calloc(N, sizeof(double)); /* メモリの確保 */
  A = calloc(N, sizeof(double)); /* メモリの確保 */
  T = calloc(N, sizeof(double)); /* メモリの確保 */
  y_real = calloc(N, sizeof(double)); /* メモリの確保 */
  y_imag = calloc(N, sizeof(double)); /* メモリの確保 */
  
  Hanning_window(w, N); /* ハニング窓 */
  
  for (frame = 0; frame < number_of_frame; frame++)
  {
    offset = N / 2 * frame;
    
    /* x(n)のFFT */
    for (n = 0; n < N; n++)
    {
      x_real[n] = pcm0.s[offset + n] * w[n];
      x_imag[n] = 0.0;
    }
    FFT(x_real, x_imag, N);
    
    /* 振幅スペクトルと位相スペクトル */
    for (k = 0; k < N; k++)
    {
      A[k] = sqrt(x_real[k] * x_real[k] + x_imag[k] * x_imag[k]);
      if (x_imag[k] != 0.0 && x_real[k] != 0.0)
      {
        T[k] = atan2(x_imag[k], x_real[k]);
      }
    }
    
    /* スペクトルサブトラクション */
    for (k = 0; k < N; k++)
    {
      A[k] -= threshold;
      if (A[k] < 0.0)
      {
        A[k] = 0.0;
     }
    }
    
    for (k = 0; k < N; k++)
    {
      y_real[k] = A[k] * cos(T[k]);
      y_imag[k] = A[k] * sin(T[k]);
    }
    IFFT(y_real, y_imag, N);
    
    /* 加工結果の連結 */
    for (n = 0; n < N; n++)
    {
      pcm1.s[offset + n] += y_real[n];
    }
  }
  
  mono_wave_write(&pcm1, "ex10_2.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm0.s); /* メモリの解放 */
  free(pcm1.s); /* メモリの解放 */
  free(w); /* メモリの解放 */
  free(x_real); /* メモリの解放 */
  free(x_imag); /* メモリの解放 */
  free(A); /* メモリの解放 */
  free(T); /* メモリの解放 */
  free(y_real); /* メモリの解放 */
  free(y_imag); /* メモリの解放 */
  
  return 0;
}
Пример #9
0
int main(void)
{
  MONO_PCM pcm0, pcm1;
  int n, m, I, J, L, offset, frame, number_of_frame;
  double fc, Q, a[3], b[3], *x, *y;
  
  mono_wave_read(&pcm0, "sample04.wav"); /* WAVEファイルからモノラルの音データを入力する */
  
  pcm1.fs = pcm0.fs; /* 標本化周波数 */
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = pcm0.length; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  
  fc = 1000.0 / pcm0.fs; /* 遮断周波数 */
  Q = 1.0 / sqrt(2.0); /* クオリティファクタ */
  I = 2; /* 遅延器の数 */
  J = 2; /* 遅延器の数 */
  
  IIR_LPF(fc, Q, a, b); /* IIRフィルタの設計 */
  
  L = 256; /* フレームの長さ */
  
  number_of_frame = pcm0.length / L; /* フレームの数 */
  
  x = calloc((L + J), sizeof(double)); /* メモリの確保 */
  y = calloc((L + I), sizeof(double)); /* メモリの確保 */
  
  for (frame = 0; frame < number_of_frame; frame++)
  {
    offset = L * frame;
    
    /* 直前のフレームの後半のJサンプルをつけ加える */
    for (n = 0; n < L + J; n++)
    {
      if (offset - J + n < 0)
      {
        x[n] = 0.0;
      }
      else
      {
        x[n] = pcm0.s[offset - J + n];
      }
    }
    
    /* 直前のフィルタリング結果の後半のIサンプルをつけ加える */
    for (n = 0; n < L + I; n++)
    {
      if (offset - I + n < 0)
      {
        y[n] = 0.0;
      }
      else
      {
        y[n] = pcm1.s[offset - I + n];
      }
    }
    
    /* フィルタリング */
    for (n = 0; n < L; n++)
    {
      for (m = 0; m <= J; m++)
      {
        y[I + n] += b[m] * x[J + n - m];
      }
      for (m = 1; m <= I; m++)
      {
        y[I + n] += -a[m] * y[I + n - m];
      }
    }
    
    /* フィルタリング結果の連結 */
    for (n = 0; n < L; n++)
    {
      pcm1.s[offset + n] = y[I + n];
    }
  }
  
  mono_wave_write(&pcm1, "ex6_4.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm0.s); /* メモリの解放 */
  free(pcm1.s); /* メモリの解放 */
  
  return 0;
}
Пример #10
0
int main(void)
{
  MONO_PCM pcm0, pcm1;
  int n, m, J, L, offset, frame, number_of_frame;
  double fe, delta, *b, *w, *x, *y;
  
  mono_wave_read(&pcm0, "sample04.wav"); /* WAVEファイルからモノラルの音データを入力する */
  
  pcm1.fs = pcm0.fs; /* 標本化周波数 */
  pcm1.bits = pcm0.bits; /* 量子化精度 */
  pcm1.length = pcm0.length; /* 音データの長さ */
  pcm1.s = calloc(pcm1.length, sizeof(double)); /* メモリの確保 */
  
  fe = 1000.0 / pcm0.fs; /* エッジ周波数 */
  delta = 1000.0 / pcm0.fs; /* 遷移帯域幅 */
  
  J = (int)(3.1 / delta + 0.5) - 1; /* 遅延器の数 */
  if (J % 2 == 1)
  {
    J++; /* J+1が奇数になるように調整する */
  }
  
  b = calloc((J + 1), sizeof(double)); /* メモリの確保 */
  w = calloc((J + 1), sizeof(double)); /* メモリの確保 */
  
  Hanning_window(w, (J + 1)); /* ハニング窓 */
  
  FIR_LPF(fe, J, b, w); /* FIRフィルタの設計 */
  
  L = 256; /* フレームの長さ */
  
  number_of_frame = pcm0.length / L; /* フレームの数 */
  
  x = calloc((L + J), sizeof(double)); /* メモリの確保 */
  y = calloc(L, sizeof(double)); /* メモリの確保 */
  
  for (frame = 0; frame < number_of_frame; frame++)
  {
    offset = L * frame;
    
    /* 直前のフレームの後半のJサンプルをつけ加える */
    for (n = 0; n < L + J; n++)
    {
      if (offset - J + n < 0)
      {
        x[n] = 0.0;
      }
      else
      {
        x[n] = pcm0.s[offset - J + n];
      }
    }
    
    for (n = 0; n < L; n++)
    {
      y[n] = 0.0;
    }
    
    /* フィルタリング */
    for (n = 0; n < L; n++)
    {
      for (m = 0; m <= J; m++)
      {
        y[n] += b[m] * x[J + n - m];
      }
    }
    
    /* フィルタリング結果の連結 */
    for (n = 0; n < L; n++)
    {
      pcm1.s[offset + n] = y[n];
    }
  }
  
  mono_wave_write(&pcm1, "ex6_3.wav"); /* WAVEファイルにモノラルの音データを出力する */
  
  free(pcm0.s); /* メモリの解放 */
  free(pcm1.s); /* メモリの解放 */
  free(b); /* メモリの解放 */
  free(w); /* メモリの解放 */
  free(x); /* メモリの解放 */
  free(y); /* メモリの解放 */
  
  return 0;
}