Перенос на Win

Тема в разделе "WASM.SOFTWARE", создана пользователем Andrei, 10 июн 2018.

  1. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Не понимаю вот это "Немного расскажу почему так получается. как ты наверное знаешь ДПФ принимает на вход комплексный сигнал и на выходе также получается компл..."

    Грубо говоря входной сигнал нужно преобразовать в комплексный вид чтобы скормить DFT ?
     
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Действительные числа - это подмножество комплексных, некорректно говорить так они по умолчанию комплексные. Действительный сигнал, это комплексный с зануленой мнимой частью.
     
    Andrei нравится это.
  3. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Просто я экспериментировал вот с этим DFT, у него на входе сигнал не комплексный x[n], насколько я понимаю комплексный x[n]+j[n]
    Код (Text):
    1.  
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <math.h>
    5. // N is assumed to be greater than 4 and a power of 2
    6. #define N 64
    7. #define PI2 6.2832
    8. // Twiddle factors (64th roots of unity)
    9. const float W[] = {
    10.      1.00000, 0.99518, 0.98079, 0.95694, 0.92388, 0.88192, 0.83147, 0.77301,
    11.      0.70711, 0.63439, 0.55557, 0.47139, 0.38268, 0.29028, 0.19509, 0.09801,
    12.     -0.00000,-0.09802,-0.19509,-0.29029,-0.38269,-0.47140,-0.55557,-0.63440,
    13.     -0.70711,-0.77301,-0.83147,-0.88192,-0.92388,-0.95694,-0.98079,-0.99519,
    14.     -1.00000,-0.99518,-0.98078,-0.95694,-0.92388,-0.88192,-0.83146,-0.77300,
    15.     -0.70710,-0.63439,-0.55556,-0.47139,-0.38267,-0.29027,-0.19508,-0.09801,
    16.      0.00001, 0.09803, 0.19510, 0.29030, 0.38269, 0.47141, 0.55558, 0.63440,
    17.      0.70712, 0.77302, 0.83148, 0.88193, 0.92388, 0.95694, 0.98079, 0.99519
    18. };
    19. int main()
    20. {
    21.     // time and frequency domain data arrays
    22.     int n, k;                     // time and frequency domain indices
    23.     float x[N];                   // discrete-time signal, x
    24.     float Xre[N/2+1], Xim[N/2+1]; // DFT of x (real and imaginary parts)
    25.     float P[N/2+1];               // power spectrum of x
    26.     // Generate random discrete-time signal x in range (-1,+1)
    27.     srand(time(0));
    28.     for (n=0 ; n<N ; ++n) x[n] = (((2.0 * rand()) / RAND_MAX) - 1.0+sin(PI2*n*16/N))/2;
    29.    // for (n=0 ; n<N ; ++n) x[n] = ((2.0 * rand()) / RAND_MAX) - 1.0;
    30.     // Calculate DFT and power spectrum up to Nyquist frequency
    31.     int to_sin = 3*N/4; // index offset for sin
    32.     int a, b;
    33.     for (k=0 ; k<=N/2 ; ++k)
    34.     {
    35.         Xre[k] = 0; Xim[k] = 0;
    36.         a = 0; b = to_sin;
    37.         for (n=0 ; n<N ; ++n)
    38.         {
    39.             Xre[k] += x[n] * W[a%N];
    40.             Xim[k] -= x[n] * W[b%N];
    41.             a += k; b += k;
    42.         }
    43.         P[k] = (sqrt(Xre[k]*Xre[k] + Xim[k]*Xim[k]))/16;
    44.     }
    45.     // Output results to MATLAB / Octave M-file for plotting
    46.     FILE *f = fopen("dftplots.m", "w");
    47.     fprintf(f, "n = [0:%d];\n", N-1);
    48.     fprintf(f, "x = [ ");
    49.     for (n=0 ; n<N ; ++n) fprintf(f, "%f ", x[n]);
    50.     fprintf(f, "];\n");
    51.     fprintf(f, "Xre = [ ");
    52.     for (k=0 ; k<=N/2 ; ++k) fprintf(f, "%f ", Xre[k]);
    53.     fprintf(f, "];\n");
    54.     fprintf(f, "Xim = [ ");
    55.     for (k=0 ; k<=N/2 ; ++k) fprintf(f, "%f ", Xim[k]);
    56.     fprintf(f, "];\n");
    57.     fprintf(f, "P = [ ");
    58.     for (k=0 ; k<=N/2 ; ++k) fprintf(f, "%f ", P[k]);
    59.     fprintf(f, "];\n");
    60.     fprintf(f, "subplot(3,1,1)\nplot(n,x)\n");
    61.     fprintf(f, "xlim([0 %d])\n", N-1);
    62.     fprintf(f, "subplot(3,1,2)\nplot([0:%d],Xre,[0:%d],Xim)\n", N/2, N/2);
    63.     fprintf(f, "xlim([0 %d])\n", N/2);
    64.     fprintf(f, "subplot(3,1,3)\nstem([0:%d],P)\n", N/2);
    65.     fprintf(f, "xlim([0 %d])\n", N/2);
    66.     fclose(f);
    67.     // exit normally
    68.     return 0;
    69. }
    70.  
     
  4. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    А ну если так то, конечно ...
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    У тебя на входе x[n] +0j
     
  6. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ты хочешь сказать что имея на входе программы I[n]+Q[n] можно сделать ОПФ (без ДПФ сначала)
     
  7. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Andrei, я тебя не понимаю.
     
  8. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ну дело в том что комплексный сигнал можно сформировать вне компьютера, и подать на стерео вход, на одном канале x[n], на другом q[n]
     
  9. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Интересно что будет если с этими x[n]+jq[n] сделать ОПФ
    Должно получиться вот это .... вроде
     

    Вложения:

    • ОПФ.png
      ОПФ.png
      Размер файла:
      8,9 КБ
      Просмотров:
      662
    Последнее редактирование: 16 июн 2018
  10. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.088
    угу.
    ну, что значит "простецкий"? в общем и целом коды-то типичные, различаются лишь по поддерживаемым аудиоформатам и используемым либам. если уж так жаждешь разобраться в кодирование звука, так та же fftw есь фосс и ты её можешь собрать под вынь. http://www.fftw.org/install/windows.html а куча фосса тута https://sourceforge.net/directory/audio-video/sound/audio-capture/os:windows/
     
  11. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Ну подаешь, выполняешь ДПФ и извлекаешь два спектра. Можешь не делать так сделав 2 преобразования подряд. В чем вопрос? Описал я это чтобы стала понятна суть как это работает "на пальцах".
     
  12. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Вот функция чтения аудио интерфейса, как тут задаётся то с какого входа читать будет , с линейного или микрофонного ?
    Непонятно семпл за раз читается один с одного канала или за раз оба канала в одном семле чтоли ?

    Код (Text):
    1.  
    2. // capture 1s from sound card
    3. void capture1s(short *samples)
    4. {
    5. int err;
    6. int rate = CAP_RATE;
    7. // capture a chunk of 1 second
    8. if ((err = snd_pcm_readi(capture_handle, samples, rate)) != rate) {
    9. printf("read from audio interface failed (%s)\n", snd_strerror(err));
    10. exit(1);
    11. }
    12.  
     
  13. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.088
    смотри откуда она хендл берёт.
     
  14. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    snd_pcm_t *capture_handle, *playback_handle;
    if ((err = snd_pcm_open(&capture_handle, sndcard, SND_PCM_STREAM_CAPTURE, 0)) < 0)
    if ((err = snd_pcm_hw_params_any(capture_handle, hw_params)) < 0) {
    if ((err = snd_pcm_hw_params_set_access(capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
    if ((err = snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) {
    if ((err = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &rate, 0)) < 0) {
    if ((err = snd_pcm_hw_params_set_channels(capture_handle, hw_params, channels)) < 0) {
    if ((err = snd_pcm_hw_params(capture_handle, hw_params)) < 0) {
    if ((err = snd_pcm_prepare(capture_handle)) < 0) {
    snd_pcm_close(capture_handle);
    if ((err = snd_pcm_readi(capture_handle, samples, rate)) != rate) {
     
  15. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Прошелся поиском, по всем файлам capture_handle это указатель, но чему он равен я так и не понял, нет присваивания нигде,
     
  16. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Нашел только snd_pcm_t *capture_handle
     
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.088
    а что это за сорцы?
     
  18. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Открываешь устройство через WaveInOpen (задаешь колбек механизм), заполняешь буфера WAVEHDR/waveInPrepareHeader и отправляешь их драйверу waveInAddBuffer. Далее стартуешь процесс захвата waveInStart. Далее через колбек механизм периодически ловишь заполненные буфера (PCM) и отправляешь их драйверу. Все. Прочти доку.
    И это только один из кучи вариантов потоковой записи.
     
    Andrei нравится это.
  19. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Распечатал саpture_handle, там число большое, причем при каждом запуске программы оно разное ,
     
  20. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ок, я записал, я буду пробовать