矩形波c语言
时间: 2023-07-02 10:05:59 浏览: 52
以下是一个简单的矩形波函数的 C 语言实现:
```c
#include <stdio.h>
#include <math.h>
#define SAMPLE_RATE 44100
#define DURATION 5
void write_wave(const char* filename, short* samples, int sample_count) {
FILE* fp = fopen(filename, "wb");
if (!fp) {
printf("Failed to open %s for writing\n", filename);
return;
}
fwrite("RIFF", 1, 4, fp);
int chunk_size = sample_count * sizeof(short) + 36;
fwrite(&chunk_size, 1, 4, fp);
fwrite("WAVE", 1, 4, fp);
fwrite("fmt ", 1, 4, fp);
int subchunk1_size = 16;
fwrite(&subchunk1_size, 1, 4, fp);
short audio_format = 1;
fwrite(&audio_format, 1, 2, fp);
short num_channels = 1;
fwrite(&num_channels, 1, 2, fp);
int sample_rate = SAMPLE_RATE;
fwrite(&sample_rate, 1, 4, fp);
int byte_rate = sample_rate * sizeof(short);
fwrite(&byte_rate, 1, 4, fp);
short block_align = sizeof(short);
fwrite(&block_align, 1, 2, fp);
short bits_per_sample = 16;
fwrite(&bits_per_sample, 1, 2, fp);
fwrite("data", 1, 4, fp);
fwrite(&sample_count, 1, 4, fp);
fwrite(samples, sizeof(short), sample_count, fp);
fclose(fp);
}
short* generate_square_wave(float frequency, int duration) {
int sample_count = SAMPLE_RATE * duration;
short* samples = malloc(sizeof(short) * sample_count);
float period = 1.0 / frequency;
int half_period_samples = (int)(SAMPLE_RATE * period / 2);
for (int i = 0; i < sample_count; i++) {
if (i % (2 * half_period_samples) < half_period_samples) {
samples[i] = SHRT_MAX;
} else {
samples[i] = SHRT_MIN;
}
}
return samples;
}
int main() {
short* samples = generate_square_wave(440, DURATION);
write_wave("square_wave.wav", samples, SAMPLE_RATE * DURATION);
free(samples);
return 0;
}
```
这个程序使用了一个 `generate_square_wave` 函数来生成一个矩形波的采样数据,然后使用 `write_wave` 函数将采样数据写入到一个 WAV 文件中。你可以通过调整 `frequency` 和 `duration` 参数来修改生成的矩形波的频率和持续时间。