Проблема при генерации синусоиды в течение более 1 секунды

Я искал почти ТАК и немного форумов, но не смог понять. Я не закодировал это с нуля. Я получил код, и я пытаюсь изменить в соответствии с моим требованием.

Итак, во-первых, кредиты на оригинальный кодер. Я рефери это: http://www3.nd.edu/~dthain/courses/cse20211/fall2013/wavfile/

Здесь он создает синусоидальную волну всего за 1 секунду. Но я не могу превзойти этот момент. Мне нужно играть в нее по крайней мере 20 секунд.

Вот мой код Надеюсь получить указатель / помощь. Заранее спасибо. Опять же благодаря оригинальному кодеру.

WAVFILE_SAMPLES_PER_SECOND = 44100

файл example.c

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <errno.h>

#include "wavfile.h"

const int NUM_SAMPLES = (WAVFILE_SAMPLES_PER_SECOND*2);

int main()
{
    unsigned long waveform[NUM_SAMPLES*4]; // here I am changing it to 4
    double frequency = 440;
    int volume = 255;
    unsigned long int length = NUM_SAMPLES*4; // here I am changing it to 4

    // For one second the length = 88200
    unsigned long int i;
    for(i=0;i<length;i++) {
        long double t = (long double) i / WAVFILE_SAMPLES_PER_SECOND;
        waveform[i] = volume*sin(frequency*t*2*M_PI);
    }

    printf("length=%d\n",length);
    FILE * f = wavfile_open("sound.wav");
    if(!f) {
        printf("couldn't open sound.wav for writing: %s",strerror(errno));
        return 1;
    }

    wavfile_write(f,waveform,length);
    wavfile_close(f);

    return 0;
}

файл wave.h

#ifndef WAVFILE_H
#define WAVFILE_H

#include <stdio.h>
#include <inttypes.h>

FILE * wavfile_open( const char *filename );
void wavfile_write( FILE *file, short data[], int length );
void wavfile_close( FILE * file );

#define WAVFILE_SAMPLES_PER_SECOND 44100

#endif

Файл успешно создан. Но я не могу играть в нее ни в одном плеере. Может ли кто-нибудь помочь. еще раз спасибо

2 ответа

Решение

С оригинальным кодом, чтобы получить 20 секунд, вам просто нужно изменить строку

const int NUM_SAMPLES = (WAVFILE_SAMPLES_PER_SECOND*2);

в

const int NUM_SAMPLES = (WAVFILE_SAMPLES_PER_SECOND*20);

В оригинальной версии файл WAV был создан за 1 секунду. Как я понимаю, это работало нормально. Следующая строка записывает 1 секунду аудио в файл.wav:

wavfile_write(f,waveform,length);

Должна быть возможность вызывать эту линию 20 раз в цикле, чтобы получить 20 секунд звука. Поскольку частота синуса составляет 440 Гц, 440 полных синусов вписываются в секунду. Таким образом, синус находится в той же позиции в начале второй секунды, что и в первой. Поэтому я думаю, что синус должен быть правильным.

Другие вопросы по тегам