【发布时间】:2015-07-14 02:10:36
【问题描述】:
我正在尝试从一个音频文件中获取内容并将它们写入另一个音频文件——除了输出应该以正常速度开始,然后随着时间的推移减慢并以原始速度的一半结束。我正在尝试拉格朗日插值方法,但似乎无法完全正确。我暂时搁置 struct 只是为了看看我在做什么。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *original, *slowdown;
unsigned int ChunkSize, Subchunk1Size, Subchunk2Size, RIFFSize, fmtSize, dataSize, SampleRate, ByteRate;
unsigned short int AudioFormat, NumChannels, BlockAlign, BitsPerSample;
char ChunkID[5], Format[5], Subchunk1ID[5], Subchunk2ID[5];
ChunkID[4] = '\0';
Format[4] = '\0';
Subchunk1ID[4] = '\0';
Subchunk2ID[4] = '\0';
char path[FILENAME_MAX], dslowdown[FILENAME_MAX];
printf("Enter path to Alejandro_project.wav file:\n");
scanf("%s", path);
strcpy(dslowdown, path);
dslowdown[strlen(path) - 21] = '\0';
strcat(dslowdown, "Alejandro_fast.wav");
original = fopen(path, "rb");
if (!original) {
printf("Error: file does not exist.\n");
return EXIT_FAILURE;
}
fread(ChunkID, 4, 1, original);
fread(&ChunkSize, 4, 1, original);
fread(Format, 4, 1, original);
fread(Subchunk1ID, 4, 1, original);
fread(&Subchunk1Size, 4, 1, original);
fread(&AudioFormat, 2, 1, original);
fread(&NumChannels, 2, 1, original);
fread(&SampleRate, 4, 1, original);
fread(&ByteRate, 4, 1, original);
fread(&BlockAlign, 2, 1, original);
fread(&BitsPerSample, 2, 1, original);
fread(Subchunk2ID, 4, 1, original);
fread(&Subchunk2Size, 4, 1, original);
fseek(original, 0, SEEK_SET);
slowdown = fopen(dslowdown, "wb");
fwrite(ChunkID, 4, 1, slowdown);
fwrite(&ChunkSize, 4, 1, slowdown);
fwrite(Format, 4, 1, slowdown);
fwrite(Subchunk1ID, 4, 1, slowdown);
fwrite(&Subchunk1Size, 4, 1, slowdown);
fwrite(&AudioFormat, 2, 1, slowdown);
fwrite(&NumChannels, 2, 1, slowdown);
fwrite(&SampleRate, 4, 1, slowdown);
fwrite(&ByteRate, 4, 1, slowdown);
fwrite(&BlockAlign, 2, 1, slowdown);
fwrite(&BitsPerSample, 2, 1, slowdown);
fwrite(Subchunk2ID, 4, 1, slowdown);
fwrite(&Subchunk2Size, 4, 1, slowdown);
short int t[4], audio[Subchunk2Size / 2], f[4];
for (i = 0; i < Subchunk2Size / 2; i++) {
fread(&data, 2, 1, original);
audio[i] = data;
}
for (i = 0; i < sizeof(t) / 2; i++)
t[i + 1] = t[i] + (11.41 - t[i]) / 11.41 * (1.0 / 22050.0) + t[i] / 11.41 * (0.4 / 22050.0);
for (i = 0; i < sizeof(f) / 2; i++) {
f[i + 1] = ((t[i] - t[i - 1]) * (t[i] - t[i + 1]) * (t[i] - t[i + 2])) / ((t[i - 2] - t[i - 1]) * (t[i - 2] - t[i + 1]) * (t[i - 2] - t[i + 2])) * f[i - 2] + ((t[i] - t[i - 2]) * (t[i] - t[i + 1]) * (t[i] - t[i + 2])) / ((t[i - 1] - t[i - 2]) * (t[i - 1] - t[i + 1]) * (t[i - 1] - t[i + 2])) * f[i - 1] + ((t[i] - t[i - 2]) * (t[i] - t[i - 1]) * (t[i] - t[i + 2])) / ((t[i + 1] - t[i - 2]) * (t[i + 1] - t[i - 1]) * (t[i + 1] - t[i + 2])) * f[i + 1] + ((t[i] - t[i - 2]) * (t[i] - t[i - 1]) * (t[i] - t[i + 2])) / ((t[i + 1] - t[i - 2]) * (t[i + 1] - t[i - 1]) * (t[i + 1] - t[i + 2])) * f[i + 2];
}
for (i = 0; i < Subchunk2Size; i++) {
audio[i] = audio[f[i]];
}
fwrite(audio, sizeof(audio), 1, slowdown);
fseek(slowdown, 40, SEEK_SET);
fwrite(&Subchunk2Size, 4, 1, slowdown);
fseek(slowdown, 40, SEEK_SET);
fwrite(audio, sizeof(audio), 1, slowdown);
fseek(slowdown, 4, SEEK_SET);
fwrite(&ChunkSize, 4, 1, slowdown);
fclose(slowdown);
fclose(original);
return EXIT_SUCCESS;
}
【问题讨论】:
-
此程序无法编译。 i 和数据未声明。编译并修复所有警告时使用 -Wall。编译干净后,就可以开始调试了。
标签: c audio interpolation wav slowdown