Перейти к содержанию
    

Здравствуйте уважаемые!

Написал такой вот код в keil 4.73

А он не компилируется не в какую, где может быть косяк???

 

#include <math.h>

unsigned int Massine[8000];

typedef union{
int ch1_ch2;
char ch[2];    
}chn;

void  sinetest(void) 
{    
    float ampvol_ch1  = 65;  
    float period_ch1   = 20; 
//-----------------------------------------
    float ampvol_ch2  = 45;  
    float period_ch2   = 30;  
//-----------------------------------------   
    float pi   = 3.14;
    int index  = 8000;
    int i      = 0;
//-----------------------------------------
    chn channel;
    
      for(i=0; i<index; i++)
    { 
             
      channel.ch[0] = 128 + (ampvol_ch1*sin(i*pi*period_ch1));  
      channel.ch[1] = 128 + (ampvol_ch2*sin(i*pi*period_ch2)); 
      Massine[i]      = channel.ch1_ch2;             
    }
}

 

Интересует правильность синтексиса!

А то я в майне вызываю эту функцию чтоб она заполнила массив, а код не компилируется!

Но ведь с виду ошибок не вижу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишет что не нравится ему что float с int мешаю или типа того!

но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишет что не нравится ему что float с int мешаю или типа того!

но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое

ну так правильно, (float)i сделайте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

От этой ошибки удалось иавится!

Теперь ругается на обьявление

chn channel;

пишет что ранее обьявлен мог быть...

Да что за фигня то?

 

union

в кейле так и не удалось попробовать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь ругается на обьявление chn channel; пишет что ранее обьявлен мог быть...

А Вы приведите тут варнинг как он есть, на английском.

 

Попутно

  1. А Вы там с union не перемудрили? Надо то и всего Massine = ch[0] | ((unsigned int)ch[1] << 8) ...
  2. Зачем используете int для Massine, если на каждый сэмпл используется только 2 байта (по байту на канал).

    Оставшиеся 4000 байт врагу подарите? :)

  3. float pi = 3.14 — это не наш метод! Про дефайн "M_PI" в хедере math.h знаете?
  4. Как насчет такого кода (ver.2):

    #include <stdio.h>
    #include <stdlib.h>
    #define _USE_MATH_DEFINES  // это нужно только для VisualStudio
    #include <math.h>
    
    typedef union {
        unsigned short data;
        struct {
            unsigned char left;
            unsigned char right;
        } chan;
    } stereo_sample_t;
    
    struct sine_param {
        float amp_vol;
        float period;
    };
    
    static unsigned char get_sine_sample(const struct sine_param *p, int i) {
        return 128u + (unsigned char)(p->amp_vol * sin(M_PI * p->period * i));
    }
    
    static void sine_test(stereo_sample_t buf[], int num_samples) {
        struct sine_param left_ch = {65, 20};
        struct sine_param right_ch = {45, 30};
        int i;
    
        for(i = 0; i < num_samples; i++) {
            buf[i].chan.left = get_sine_sample(&left_ch, i);
            buf[i].chan.right = get_sine_sample(&right_ch, i);
        }
    }
    
    
    int main(void) {
        stereo_sample_t Massine[8000];
    
        sine_test(Massine, sizeof(Massine) / sizeof(Massine[0]));
        return 0;
    }

    Так вот немного приятнее...

Изменено пользователем winipuh

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Спасибо!!!

Ну может и перемудрил конечно!

M_PI не знал спасибо!

 

Автор! Поаккуратнее с цитированием! Для того, чтобы сказать "спасибо" не обязательно бездумно копировать весь предыдущий пост кнопкой "Reply".

От себя добавлю, что если Вы так же грамотно и внимательно пишете на С, как на русском, то удивляться совершенно нечему...

Изменено пользователем Herz
Избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал для теста в Dev-C++ код который бы должен был по идеи вывести значения в отдельный файл txt

Но не прокатывает

В файл пишется ерунда всякая, но не то что ожидалось...

 

#include <iostream>   
#include <fstream> 
#include <math.h>

using namespace std;

typedef union {
    unsigned short data;
    struct {
        unsigned char left;
        unsigned char right;
    } chan;
} stereo_sample_t;

struct sine_param {
    float amp_vol;
    float period;
};

static unsigned char get_sine_sample(const struct sine_param *p, int i) {
    return 128u + (unsigned char)(p->amp_vol * sin(M_PI * p->period * i));
}

static int sine_test(stereo_sample_t buf[], int num_samples) {
       
    struct sine_param left_ch = {65, 20};
    struct sine_param right_ch = {45, 30};
    int i;

    for(i = 0; i < num_samples; i++) {
        buf[i].chan.left = get_sine_sample(&left_ch, i);
        buf[i].chan.right = get_sine_sample(&right_ch, i);
              
    }
} 


int main(void) {  
  
ofstream File1;
File1.open("C:/MasCH1.txt"); 

stereo_sample_t Massine[8000] = {0};
sine_test(Massine, sizeof(Massine) / sizeof(Massine[0]));
        
for(int i = 0; i < sizeof(Massine) / sizeof(Massine[0]); i++)   { 
        
    File1 << Massine[i].data << endl; 
    }                          

File1.close();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В файл пишется ерунда всякая, но не то что ожидалось...
А что именно Вы ожидали? Тут телепатов нет :)

 

Для начала

ampvol_ch1*sin(i*pi*period_ch1)

1) Есть понятие кол-во отсчетов в секунду — SampleRate (1/SampleRate — это интервал дискретизации)

2) Есть частота генерируемого синуса — Frequency (1/Frequency — это период синуса)

Итого — i-ый отсчет синуса выражается так: A * sin(2 * PI * Freq * i / SampleRate)

 

Дело за малым:

1) Перевести эту формулу в С/С++

2) Подумать/подправить структуры данных, функции и т.д. (чтобы не засрать исходник)...

:laughing:

Изменено пользователем winipuh

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понемемаете мне нужна функция тестовая которая в массив сложила жы синус, два канала, причём первый канал был бы в старшем, а второй в младшем байтах двух байтового слова!

И я мог бы обратится к этому массиву из других функций!

Тоесть взять индекс массива mass;

И в этом индексе массива были бы данные синуса для двух каналов.

Ещё раз повторяю, что это тестовая функция и она нужна лишь для теста других функций в программе!

В реале значения будут братся не из этой тестовой функции, а с реальных АЦП

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Без обид, но... Вам сколько лет? :)

 

 

Понемемаете мне нужна функция тестовая которая в массив сложила жы синус, два канала

#include <iostream>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>


class SinGen {
   float amp;
   float phase_inc;
public:
   SinGen(float amplitude, float frequency, unsigned int rate = 8000)
   {
       amp = amplitude;
       phase_inc = (float(2 * M_PI) * frequency) / rate;
   }
   unsigned char getSample(int i)
   {
       return 128u + (unsigned char)(amp * sin(phase_inc * i));
   }
};

typedef union {
   unsigned short data;
   struct {
       unsigned char left;
       unsigned char right;
   } chan;
} stereo_sample_t;


static void sine_test(stereo_sample_t *buf, int num_samples) {
   SinGen left_ch(65, 10);
   SinGen right_ch(45, 20);

   for(int i = 0; i < num_samples; i++) {
       buf[i].chan.left = left_ch.getSample(i);
       buf[i].chan.right = right_ch.getSample(i);
   }
}


int main(void) {
   using namespace std;

   enum {BUF_SIZE = 8000};
   stereo_sample_t sine_buf[bUF_SIZE];
   sine_test(sine_buf, BUF_SIZE);

   ofstream SinDataFile;
   SinDataFile.open("sin.txt"); 
   for (int i = 0; i < BUF_SIZE; i++) {
       SinDataFile << i << '\t';
       SinDataFile << (unsigned)sine_buf[i].chan.left << '\t' << (unsigned)sine_buf[i].chan.right;
       SinDataFile << endl;
   }

   SinDataFile.close();
   return 0;
}

post-74189-1386087693_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

winipuh

Да ничего страшного!

Обзывайтесь :-)

Я новичёк ещё в сим деле, хоть и стар уже!!!

А вам Спасибо, за ваш труд!!!!

 

Но пишу я на чистом "си" где нет никаких классов!

 

И пишу пока как видите плохо, но я верю в то что когда нибуть стану писать значительно лучше

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Без обид, но... Вам сколько лет? :)

 

не в какую

синтексиса

синусойду

обьявление

по идеи

Понемемаете

будут братся

новичёк

когда нибуть

 

хоть и стар уже!!!

не верю :1111493779:

 

про запятые вообще молчу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

toweroff

 

Во дворе весь день стучат

Двое стриженых внучат.

 

Дед им вынес настоящий

С круглой шляпкой молоток:

- Вот, ребята, сбейте ящик

Из распиленных досок.

 

Яша стукнул по доске,

А попало по руке.

 

Больно пальцу - не беда,

Так бывает иногда.

 

Белой тряпочкой завязан

Средний палец у него.

Но и к деду ведь не сразу

Приходило мастерство.

 

Повнимательнее будь,

К мастерству не лёгок путь!

 

Взял Никита молоток

И ударил ловко.

Покосилась только вбок

У гвоздя головка.

 

Покосилась - не беда.

Так бывает иногда.

 

- Не беда, что у ребят,

Как заметил кто-то,

Ящик вышел кривоват, -

Первая работа!

 

Главное по спокойнее!

Вы не дали не одного умного совета даже и на грамм, но умника стриите на целый киллограм!

 

 

ВИНИПУХУ огромное спассибо за науку!!!!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...