звуковая волна пилообразная в с - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать пилообразную волну в с.Я так близок к концу своей работы, но у меня есть проблема, которая должна быть решена.Я прикрепил клод ниже.

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <tgmath.h>

/******************************
*  Magic file format strings. *
******************************/
const char fChunkID[]     = {'R', 'I', 'F', 'F'};
const char fFormat[]      = {'W', 'A', 'V', 'E'};
const char fSubchunk1ID[] = {'f', 'm', 't', ' '};
const char fSubchunk2ID[] = {'d', 'a', 't', 'a'};

/********************************
* WriteWavePCM() configuration: *
* - 2 channels,                 *
* - frequency 44100 Hz.         *
********************************/
const unsigned short N_CHANNELS = 2;
const unsigned int SAMPLE_RATE = 48000;
const unsigned short BITS_PER_BYTE = 8;

bool WriteWavePCM(short* sound, size_t pairAmount, char* fileName){
    const static unsigned int fSubchunk1Size = 16;
    const static unsigned short fAudioFormat = 1;
    const static unsigned short fBitsPerSample = 16;

    unsigned int fByteRate = SAMPLE_RATE * N_CHANNELS * fBitsPerSample / BITS_PER_BYTE;

    unsigned short fBlockAlign = N_CHANNELS * fBitsPerSample / BITS_PER_BYTE;
    unsigned int fSubchunk2Size;
    unsigned int fChunkSize;

    FILE* fout;
    size_t ws;

    if (!sound || !fileName || !(fout = fopen( fileName, "w" ))) return false;

    fSubchunk2Size = pairAmount * N_CHANNELS * fBitsPerSample / BITS_PER_BYTE;
    fChunkSize = 36 + fSubchunk2Size;

    // Writing the RIFF header:
    fwrite(&fChunkID, 1, sizeof(fChunkID),      fout);
    fwrite(&fChunkSize,  sizeof(fChunkSize), 1, fout);
    fwrite(&fFormat, 1,  sizeof(fFormat),       fout);

    // "fmt" chunk:
    fwrite(&fSubchunk1ID, 1, sizeof(fSubchunk1ID),      fout);
    fwrite(&fSubchunk1Size,  sizeof(fSubchunk1Size), 1, fout);
    fwrite(&fAudioFormat,    sizeof(fAudioFormat),   1, fout);
    fwrite(&N_CHANNELS,      sizeof(N_CHANNELS),     1, fout);
    fwrite(&SAMPLE_RATE,     sizeof(SAMPLE_RATE),    1, fout);
    fwrite(&fByteRate,       sizeof(fByteRate),      1, fout);
    fwrite(&fBlockAlign,     sizeof(fBlockAlign),    1, fout);
    fwrite(&fBitsPerSample,  sizeof(fBitsPerSample), 1, fout);

    /* "data" chunk: */
    fwrite(&fSubchunk2ID, 1, sizeof(fSubchunk2ID),      fout);
    fwrite(&fSubchunk2Size,  sizeof(fSubchunk2Size), 1, fout);

    /* sound data: */
    ws = fwrite(sound, sizeof(short), pairAmount * N_CHANNELS, fout);
    fclose(fout);
    return true;
}

////////////////////////////////////////////////

const unsigned int N_SAMPLE_PAIRS = 50000;

int main(int argc, char* argv[]){
    short* sound;
    int i;
    int j;
    bool status;
    char* file_name;
    int l; // dodane

    sound = (int*) malloc(sizeof(int) * N_SAMPLE_PAIRS * N_CHANNELS );

    if (!sound)
    {
        puts("Could not allocate space for the sound data.");
        return (EXIT_FAILURE);
    }

    int amplitude = 10000;
    int frequency = 80;
    short record = 0;
    short waveNumber = 1;
    int samplesPerWavelength = SAMPLE_RATE / (frequency/N_CHANNELS);
    int soundLen = 10 * samplesPerWavelength;
    int ampStep = (int)((amplitude*2)/(int)samplesPerWavelength);
    short step = 5*samplesPerWavelength;
    short muteRate = amplitude/(soundLen/samplesPerWavelength);
    int totalSamplesWritten = 0;
    int tempSample =0;

    for (i=0, j=0; i<N_SAMPLE_PAIRS*N_CHANNELS; i+=2, j++) {
        ampStep = (int)((amplitude*2)/(int)samplesPerWavelength);
        tempSample = (int)((totalSamplesWritten%samplesPerWavelength)*ampStep);
        sound[i] = tempSample;
        sound[i+1] = tempSample;
        totalSamplesWritten++;
    }


    file_name = argc > 1 ? argv[1] : "Default2.wav";
    status = WriteWavePCM(sound, N_SAMPLE_PAIRS, file_name);


    free(sound);

    if (status)
    {
        printf("Discotheque is ready in \"%s\"\n", file_name);
    }
    else
    {
        puts( "Something seems to have gone wrong." );
        return (EXIT_FAILURE);
    }

    return 0;
}

Вот мой результат.Есть пилообразная, но со странным поведением.Я не знаю, почему это там.Я проверил мой массив образцов, и все выглядит хорошо.

enter image description here

Может кто-нибудь помочь мне?Я застрял и не знаю, что делать.Я проверил это в 2 разных программах: audiocity и wavepadaudio, и в обоих случаях такое поведение существует.Так что у меня проблемы с моим кодом наверняка.Помогите мне, пожалуйста.

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Когда я посмотрел дамп файла (компиляция MSVC), я заметил несколько 0D 0A пар данных.Затем я изменил

fout = fopen( fileName, "w" )

на этот бинарный файл

fout = fopen( fileName, "wb" )

, и теперь ошибка исчезла.

Обратите внимание, что

Если t или b не задано в mode, режим перевода по умолчанию определяется глобальной переменной _fmode.

Таким образом, режим перевода по умолчанию должен быть "текст».

0 голосов
/ 27 ноября 2018

Вот некоторые снимки экрана с выводом, который я получаю.Кажется, хорошо для меня.

Использование встроенных спецификаций.COLLECT_GCC = gcc COLLECT_LTO_WRAPPER = / usr / lib / gcc / i686-pc-cygwin / 5.4.0 / lto-wrapper.exe Цель: i686-pc-cygwin Настраивается с помощью: / cygdrive / i / szsz / tmpp / gcc / gcc-5.4.0-1.i686 / src / gcc-5.4.0 / configure --srcdir = / cygdrive / i / szsz / tmpp / gcc / gcc-5.4.0-1.i686 / src / gcc-5.4.0 --prefix = / usr --exec-prefix = / usr --localstatedir = / var --sysconfdir = / etc --docdir = / usr / share / doc / gcc --htmldir = / usr / share / doc / gcc /h tml -C --build = i686-pc-cygwin --host = i686-pc-cygwin --target = i686-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir = /usr / lib --enable-shared --enable-shared-libgcc --enable-static --enable-специфичный для версии-runtime-libs --enable-bootstrap --enable -__ cxa_ate xit --with-dwarf2 --with-arch = i686 --with-tune = универсальные --disable-sjlj-исключения --enable-languages ​​= ada, c, c ++, фортран, java, lto, objc, obj-c ++ --enable-графит --enable-threads = posix --enable-libatomic --enable-libcilkrts --enable-libgomp --enable-libitm --enable-libquadmath --enab le-libquadmath-support --enable-libssp --enable-libada --enable-libjava --enable-libgcj-sublibs --disable-java-awt --disable-symvers --with- ecj-jar = / usr / share / java / ecj.jar --with-gnu-ld --with-gnu-as --with-cloog-include = / usr / include / cloog-isl --without-libiconv-prefix --without- libintl-prefix --with-system-zlib --enable-linker-build-id --with-default-libstdcxx-abi = gcc4-совместимая модель потока: posix gcc версии 5.4.0 (GCC)

uname -a CYGWIN_NT-6.1-WOW DE-E03895 2.8.0(0.309 / 5/3) 2017-04-01 20:42 i686 Cygwin

Here it is

Zoomed in

Вот снимок экрана с искаженными образцами в вашем выводе;

enter image description here

...