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); }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }