Обща програма за адитивен синтез

Опитвам се да напиша обща c програма за адитивен синтез, която ще генерира сложна синусоида, създадена от поредица от чисти синусоиди с произволна честота, следващи една обвивка. Входният файл ще бъде нещо подобно

F0     P0                   // a list of up to 100 floats indicating frequencies and 
F1     P1                   // % contribution of this frequency to the sound
F2     P2
....
-1                          // sentinal value to indicate end of frequency list 
B0     A0                   //  first breakpoint
B1     A1
...                         // There can be an arbitary number of breakpoints

Искам моята програма да генерира WAV файл до последната точка на прекъсване, където всички синусоиди ще бъдат генерирани на дадените честоти, мащабирани до % принос, както е посочено, и добавени заедно, за да направят крайния звук

Опитах се да изпробвам някои от C програмирането, но по природа не съм C програмиране, така че това е, което направих досега:

#include <stdio.h>
#include <stdlib.h>
#include <portsf.h>
#include <math.h>
#ifndef M_PI
#define M_PI (3.141592654)
#endif

// Additive Synthesis

PSF_PROPS props;
props.srate = 44100;
props.chans = 2;
props.samptype = PSF_SAMP_IEEE_FLOAT;
props.format = PSF_STDWAVE;
props.chformat = STDWAVE;

float* frame;

int sampleNumber;
double angleIncrement;
double frequency;
double sampleRate;
int i;
int twopi = 2.0 * M_PI;

ofd = psf_sndCreate(argv[2],&props,0,0,PSF_CREATE_RDWR);

int main (int argc, char* argv[]) {

sampleNumber = 0;
angleIncrement = twopi * frequency/sampleRate;
while (i < sampleNumber) {
    frame[0] = frame[1] = sin(sampleNumber * angleIncrement);
    sampleNumber++;
    if (fwrite(&sampleout,sizeof(float),1,rawfile) !=1) {
        printf("Error writing to output file.\n");
        return 1;
    }
    if (i <=1000) 
        fprintf(bpfile, "%ld\t%f\n", i, frame);
    phase += angleIncrement;
    if (phase >= twopi)
        phase -= twopi;
}

phase_offset = -1 * PI / 2;
sample_buffer = (float*) malloc(samples * sizeof(float));
// sample_buffer set back to 0
memset(sample_buffer, 0, sizeof(float)*sampleNumber);

// go through the number of harmonics
for (i = 1; i <= NHARMS; i++) {
    amp = 1.0 / i;
    // go through number of sinusoid components
    for (n = 0; n < sampleNumber; n++) { 
        sample_buffer[n] += amp * cos(i * angleIncrement * n + phase_offset);
    }
}       
}

Въпреки това не съм много сигурен дали изобщо правя това правилно. Някакви идеи как мога да поправя това и да продължа?


person NuNu    schedule 22.10.2012    source източник
comment
Каква е грешката, която получавате?   -  person im so confused    schedule 22.10.2012
comment
@AK4749 Получавам това като No such file or directory gcc: no input files Но освен това не съм напълно сигурен дали всъщност подхождам правилно към проблема   -  person NuNu    schedule 22.10.2012
comment
добре, можем бавно да преминем през този проблем един по един, но първо ми се струва, че или имате неправилна настройка на gcc, или използвате грешен синтаксис, за да го извикате. Можете ли да компилирате проста програма hello world?   -  person im so confused    schedule 22.10.2012
comment
+1 за създаване на допълнителен синтезатор.   -  person drew010    schedule 22.10.2012


Отговори (2)


Тъй като започнах да забелязвам все повече и повече дребни подробности, коментарите започват да стават досадни за четене (но се уверете, че все пак отговаряте на компилиращия ми Hello World въпрос), така че ги обединих в този отговор и ще го актуализирам, когато видя повече :

  1. към момента frequency се използва само веднъж и по това време е само 0.0 някога. това ли искаш?
  2. i се инициализира в 0, а sampleNumber също се стартира в 0. Така условието while (i < sampleNumber) никога няма да се изпълни
  3. i никога не се увеличава, но имате условие if ( i <= 1000 ), което по този начин винаги ще оценява true
  4. sampleRate се инициализира на 0.0 и първата операция върху него е да се раздели на него, което очевидно не е щастливо време
  5. Очевидно педантично, но n в най-долния for цикъл никога не се декларира (int n; for (n = ....) като пример.
  6. във вашия sample_buffer = (float*) malloc(samples * sizeof(float)); ред, samples най-вероятно трябва да бъде sampleNumber, нали? samples никога не се дефинира
person im so confused    schedule 22.10.2012
comment
нещо не беше наред с моя gcc, но това беше поправено, така че успях да стартирам въпроса за здравей свят. Поправих няколко неща, но все още получавам купища грешки - person NuNu; 24.10.2012
comment
има ли имейл, на който мога да ви изпратя имейл, защото тази нишка за коментари може да се връща назад и напред за известно време - person NuNu; 24.10.2012
comment
Разбира се, изпратете имейл на това: ‹[email protected]› без скоби, и аз ще ви дам по-добра информация за контакт оттам - това е уебсайт с висок профил, не искам да публикувам истинския си имейл, ха-ха. Ще бъде отворено 24 часа. - person im so confused; 24.10.2012

Съгласен съм с AKA4749 и имам още нещо, което трябва да направите: изрежете семплите, когато ги добавите, или ще получите изкривяване:

if ( sample[i] > 1 ) sample[i] = 1;
else if ( sample[i] < -1 ) sample[i] = -1;
person Rafael Baptista    schedule 22.10.2012