Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/55: Рейтинг темы: голосов - 55, средняя оценка - 4.62
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213

Преобразование Фурье на ассемблере

14.07.2010, 10:44. Показов 11510. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ну так и здравствуйте! Имеется код на с (функция выполняет быстрое преобразование фурье):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
void Fft2(double *in_Buffer, double *out_Buffer, long fftFrameSize, long sign)
{
    double wr, wi, arg, *p1, *p2, temp;
    double tr, ti, ur, ui, *p1r, *p1i, *p2r, *p2i;
    long i, bitm, j, le, le2, k;
 
    memcpy(out_Buffer, in_Buffer, fftFrameSize*2*sizeof(double));
 
    for (i = 2; i < 2*fftFrameSize-2; i += 2)
    {
        for (bitm = 2, j = 0; bitm < 2*fftFrameSize; bitm <<= 1)
        {
            if (i & bitm) j++;
            j <<= 1;
        }
        if (i < j)
        {
            p1 = out_Buffer+i; p2 = out_Buffer+j;
            temp = *p1; *(p1++) = *p2;
            *(p2++) = temp; temp = *p1;
            *p1 = *p2; *p2 = temp;
        }
    }
    long lim = (long)(log((double)fftFrameSize)/log(2.)+.5);
    for (k = 0, le = 2; k < lim; k++)
    {
        le <<= 1;
        le2 = le>>1;
        ur = 1.0;
        ui = 0.0;
        arg = pi / (le2>>1);
        wr = cos(arg);
        wi = sign*sin(arg);
        for (j = 0; j < le2; j += 2)
        {
            p1r = out_Buffer+j; p1i = p1r+1;
            p2r = p1r+le2; p2i = p2r+1;
            for (i = j; i < 2*fftFrameSize; i += le)
            {
                tr = *p2r * ur - *p2i * ui;
                ti = *p2r * ui + *p2i * ur;
                *p2r = *p1r - tr; *p2i = *p1i - ti;
                *p1r += tr; *p1i += ti;
                p1r += le; p1i += le;
                p2r += le; p2i += le;
            }
            tr = ur*wr - ui*wi;
            ui = ur*wi + ui*wr;
            ur = tr;
        }
    }
}
Я переписал его на ассемблер:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
.686p
.XMM
 
.model c,flat
 
; parametrs
in_data     equ dword ptr [ebp+8]
out_data    equ dword ptr [ebp+12]
size_data   equ dword ptr [ebp+16]
 
; local
dtemp   equ dword ptr [ebp-4]   ;dd 0
ftemp   equ qword ptr [ebp-12]  ;dq 0.0
wr  equ qword ptr [ebp-20]  ;dq 0.0
wi  equ qword ptr [ebp-28]  ;dq 0.0
 
 .code
 
public FFT_SSE2
 
; void FFT_SSE2( double *in_data, double *out_data, int fftFrameSize)
FFT_SSE2 proc
push    ebp
mov ebp, esp
;add    ebp, 8
sub esp, 28
 
; memcpy(out_Buffer, in_Buffer, fftFrameSize*2*sizeof(double));
 
mov ecx, size_data
shl ecx, 2              ; * 2 * sizeof(double)
mov esi, in_data
mov edi, out_data
rep movsd
 
mov ecx, 2              ; ecx - i
_l0:
 
mov edx, 2              ; edx - bitm
xor ebx, ebx            ; ebx - j
_l1:
 
mov eax, ecx
and eax, edx
jz  _l3
inc ebx
_l3:
shl ebx, 1
 
shl edx, 1
mov eax, size_data
shl eax, 1
cmp edx, eax
jb  _l1
 
cmp ecx, ebx
jnb _l4
mov eax, out_data
movapd  xmm0, qword ptr [eax+ecx*8] ; p1 = out_Buffer+i
movapd  xmm1, qword ptr [eax+ebx*8] ; p2 = out_Buffer+j
movapd  qword ptr [eax+ecx*8], xmm1
movapd  qword ptr [eax+ebx*8], xmm0
_l4:
 
add ecx, 2
mov eax, size_data
shl eax, 1
sub eax, 2
cmp ecx, eax
jb  _l0
 
fld1
fild    size_data
fyl2x
frndint
fistp   dtemp               ; (long)log2(size)
mov edx, dtemp
 
xor ecx, ecx                ; ecx - k
mov ebx, 2              ; ebx - le
main_loop:
 
push    edx
mov eax, ebx
shl ebx, 1
fldpi
shr eax, 1
mov dtemp, eax
fidiv   dtemp               ; st(0): arg = pi / (le2>>1)
fsincos                 ; st(0)=cos(arg) st(1)=sin(arg)
fstp    wr
fchs
fstp    wi
xorpd   xmm2, xmm2          ; ur|ui
fld1
fstp    ftemp
movlps  xmm2, qword ptr [ftemp]
 
xor esi, esi            ; esi - j
_loop1:
 
mov eax, out_data
mov edx, esi
shl edx, 3
add eax, edx            ; eax = out_data + j
 
mov edi, esi
_loop2:
 
movapd  xmm3, xmm2  ; push xmm2
 
movapd  xmm0, xmm2
movddup xmm1, qword ptr [eax+ebx*4+8]
movddup xmm2, qword ptr [eax+ebx*4]
mulpd   xmm2, xmm0
shufpd  xmm0, xmm0, 1
mulpd   xmm1, xmm0
addsubpd xmm2, xmm1
 
movapd  xmm0, xmmword ptr [eax]     ; *p1
subpd   xmm0, xmm2
movapd  xmmword ptr [eax+ebx*4], xmm0
 
movapd  xmm0, xmmword ptr [eax]
addpd   xmm0, xmm2
movapd  xmmword ptr [eax], xmm0
 
movapd  xmm2, xmm3  ; pop xmm2
 
push    ebx
shl ebx, 3
add eax, ebx
pop ebx
 
add edi, ebx
mov edx, size_data
shl edx, 1
cmp edi, edx
jb  _loop2
 
movapd  xmm0, xmm2
movddup xmm1, qword ptr [wi]
movddup xmm2, qword ptr [wr]
mulpd   xmm2, xmm0
shufpd  xmm0, xmm0, 1
mulpd   xmm1, xmm0
addsubpd xmm2, xmm1
 
add esi, 2
mov eax, ebx
shr eax, 1
cmp esi, eax
jb  _loop1
 
inc ecx
pop edx
cmp ecx, edx
jb  main_loop
 
mov esp, ebp
pop ebp
retn
FFT_SSE2 endp
 
end
Все работает как надо. Но я ожидал что использование sse3 увеличит производительность и функция будет работать хотя бы вдвое быстрее аналога с сопроцессором. В результате моя функция работает быстрее сишной тока на 15%. Посмотрите пожалуйста, можно ли как то оптимизировать - почему так медленно?
ЗЫ: память выровнена по адресам кратным 16
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.07.2010, 10:44
Ответы с готовыми решениями:

Найти коэффиценты разложения в ряд Фурье, используя быстрое преобразование Фурье (БПФ)
Прошу помочь мне в нелеггкой задачке нужно для заданной на периоде 2∏ функции f(x) найти коэффициенты разложения в ряд Фурье, используя...

Преобразование звукового сигнала в спектр (Фурье-преобразование)
Доброго времени суток! Мне необходимо преобразовать звуковой файл в спектр, а как и с чего начать я не понимаю

Быстрое преобразование Фурье и ошибка "Неявное преобразование типа"
А подскажите еще по одной прблемке: Есть программа реализующая БПФ (ну должна по крайней мере это делать) using System; using...

43
шарпопочитатель
 Аватар для ht1515
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
06.06.2011, 13:01
Студворк — интернет-сервис помощи студентам
На выходе будет фурье-образ сигнала.
это что типо как если бы я ФНЧ фильтровал например? То есть синусойда и будет?

C++
1
так ты просто присвоишь указателю адрес своего массива, без всякого выравнивания памяти.
ну да.Прокатит же? Я пока хочу просто хоть что-то получить. Потом буду ускорять обработку данных. А пока просто надо хоть что-то получить в итоге.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
06.06.2011, 13:50  [ТС]
Цитата Сообщение от ht1515 Посмотреть сообщение
это что типо как если бы я ФНЧ фильтровал например? То есть синусойда и будет?
ht1515, тебе не помешало бы освежить в памяти теорию Фурье образ сигнала это разложение исходного сигнала на синусоидальные и косинусоидальные гармоники кратных частот. Каждый коэффициент разложения (элемент массива) означает амплитуду (вес) гармоники определенной частоты, какой именно - легко посчитать по простой пропорции:
частота = n элемент * частота дискретизации / длина массива
То есть ФНЧ можно свести просто к обнулению первых элементов до необходимой частоты.

Цитата Сообщение от ht1515 Посмотреть сообщение
ну да.Прокатит же? Я пока хочу просто хоть что-то получить. Потом буду ускорять обработку данных. А пока просто надо хоть что-то получить в итоге.
Ну так я же практически так и делаю - сначала создаю массив
C++
1
double *signal = new double[size_data];// = {7,8,11,15,17,14,9,5,2,-1,-4};
затем заполняю его (генерирую сигнал с несущей 12800 и частотой дискретизации 250 кГц)
C++
1
2
for(int i=0;i<size_data;i++)
        signal[i] = sin(2*pi*12800*i/250000);
и затем в память с выровненными адресами копирую этот сигнал, приводя его к комплексной форме (мнимая часть нули):
C++
1
2
3
4
5
6
7
8
double *smb_signal = (double*)_aligned_malloc(sizeof(double)*(size_data<<1), 16);//new double[size_data<<1];
double *temp = smb_signal;
 
for(int i=0; i<size_data; i++)
{
    *(temp++) = signal[i];
    *(temp++) = 0;
}
0
шарпопочитатель
 Аватар для ht1515
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
06.06.2011, 14:03
БПФ алгоритм. Я в поисковике не то искал видимо. БПФ везде есть на с++.
вот например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <math.h>
#include <stdio.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Chart"
#pragma link "TeEngine"
#pragma link "TeeProcs"
#pragma link "Series"
#pragma resource "*.dfm"
TForm1 *Form1;
#define _USE_MATH_DEFINES
 
 
double *FFT( int *dIn, int nn )
{
    int i, j, n, m, mmax, istep;
    double tempr, tempi, wtemp, theta, wpr, wpi, wr, wi;
 
    int isign = -1;
    double *data = new double [ nn * 2 + 1 ];
 
    for( i = 0; i < nn; i++ )
    {
        data[ i * 2 ] = 0;
        data[ i * 2 + 1 ] = dIn[ i ];
    }
 
    n = nn << 1;
    j = 1;
    i = 1;
    while( i < n )
    {
        if( j > i )
        {
            tempr = data[ i ]; data[ i ] = data[ j ]; data[ j ] = tempr;
            tempr = data[ i + 1 ]; data[ i + 1 ] = data[ j + 1 ]; data[ j + 1 ] = tempr;
        }
        m = n >> 1;
        while( ( m >= 2 ) && ( j > m ) )
        {
            j = j - m;
            m = m >> 1;
        }
        j = j + m;
        i = i + 2;
    }
    mmax = 2;
    while( n > mmax )
    {
        istep = 2 * mmax;
        theta = 2.0 * M_PI / ( isign * mmax );
        wtemp = sin( 0.5 * theta );
        wpr = -2.0 * wtemp * wtemp;
        wpi = sin( theta );
        wr = 1.0;
        wi = 0.0;
        m = 1;
        while( m < mmax )
        {
            i = m;
            while( i < n )
            {
                j = i + mmax;
                tempr = wr * data[ j ] - wi * data[ j + 1 ];
                tempi = wr * data[ j + 1 ] + wi * data[ j ];
                data[ j ] = data[ i ] - tempr;
                data[ j + 1 ] = data[ i + 1 ] - tempi;
                data[ i ] = data[ i ] + tempr;
                data[ i + 1 ] = data[ i + 1 ] + tempi;
                i = i + istep;
            }
            wtemp = wr;
            wr = wtemp * wpr - wi * wpi + wr;
            wi = wi * wpr + wtemp * wpi + wi;
            m = m + 2;
        }
        mmax = istep;
    }
    double *dOut = new double [ nn / 2 ];
 
    for( i = 0; i < ( nn / 2 ); i++ )
    {
        dOut[ i ] = sqrt( data[ i * 2 ] * data[ i * 2 ] + data[ i * 2 + 1 ] * data[ i * 2 + 1 ] );
    }
 
    delete []data;
    return dOut;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 int *dsin = new int [ 1801 ], *pdsin = dsin;
 
    for( double x = 0.; x <= 10. * M_PI; x += M_PI / 180.0 )
    {
        *pdsin++ =  sin( x ) * 1000. + cos( 0.5 * x ) * 1000.;
        Chart1->Series[0]->AddXY(x, sin( x ) * 1000. + cos( 0.5 * x ) * 1000.);
    }
 
    double *dfourier = FFT( dsin, 1024 );
    delete []dsin;
 
    for( int i = 0; i < 512; i++ )
    {
        printf( "%d\t%lf\r\n", i, dfourier[ i ] );
    }
 
    for( int i = 0; i < 512; i++ )
    {
    Chart2->Series[0]->AddXY(i,dfourier[ i ]);
    }
 
    delete []dfourier;
 
}
//---------------------------------------------------------------------------
Миниатюры
Преобразование Фурье на ассемблере  
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
06.06.2011, 14:11  [ТС]
ht1515, это тот же самый алгоритм, только возвращает сразу амплитудный спектр (берет по модулю). А вообще оффтоп пошел какой то... Есть еще вопросы по алгоритму или его использованию именно на ассемблере?
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 12:00
Виталий как с Вами связаться возникли вопросы по данной теме мое мыло kosem777@gmail.com
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.12.2011, 13:04  [ТС]
Цитата Сообщение от kosem Посмотреть сообщение
как с Вами связаться
а вот прям тут можно и связаться)
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 13:47
Я же специально дал мыло неужели трудно написать я нехочу флудить в Вашей теме если коротко то ассемблерный код который вы выложили у меня не работает (к примеру mov ecx, size_data
shl ecx, 2 ; * 2 * sizeof(double) ) даст не double size a увеличинеие буфера в 4 раза хотелось бы разобраться возможно я гдето недопонимаю.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.12.2011, 14:06  [ТС]
Если есть вопросы по коду то это не флуд.

Цитата Сообщение от kosem Посмотреть сообщение
(к примеру mov ecx, size_data
shl ecx, 2 ; * 2 * sizeof(double) ) даст не double size a увеличинеие буфера в 4 раза хотелось бы разобраться возможно я гдето недопонимаю.
sizeof(double) это 8 байт (на интел), а я пересылаю по 4 байта. Поэтому умножаю не на 2 а на 4.
А почему не работает то? Покажите как вы тестировали? Код
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 14:20
Вот мой тест
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.12.2011, 14:40  [ТС]
Цитата Сообщение от kosem Посмотреть сообщение
Вот мой тест
это хороший, годный тест)
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 14:46
Да все работает если изначально в ecx передается 0 ! А в противном случае все падает.
Если у вас есть откомпилированный прием скинте рабочий я посмотрю под отладчиком.
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 14:49
Вот к примеру еще один вариант
Вложения
Тип файла: rar lo2.rar (1.9 Кб, 28 просмотров)
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.12.2011, 14:53  [ТС]
посмотрите в этой теме https://www.cyberforum.ru/post1730787.html (пост №18) Я писал про выравнивание памяти, скорее всего проблема именно в этом
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 14:59
Виталий я все это рочитал прежде чем вас беспокоить давайте по существу, у вас есть рабочий пример?
Я свой вариант вам скинул будьте взаимно вежливы.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.12.2011, 15:06  [ТС]
я вам тоже скинул код на котором тестировал. Этот код изначально был предназначен для вызова из с++, на ассемблере я не испытывал. Если вам интересно, я проверю. Проблема в общем только одна - память должна быть выровнена, это требование большинства simd команд.
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 15:15
Виталий конечно мне интересно я и на форуме зарегистрировался только чтобы обсудить с вами эту тему если у вас есть рабочий пример на c++ (не исходник а откомпилированный пример) скинте я посмотрю. Если вы можете посмотрите мой исходник на ASM а именно lo2.rar что там не так я буду вам признателен.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
07.12.2011, 17:22  [ТС]
посмотрел ваш исходник, к сожалению не смог скомпилировать, у меня наверно старый масм32, не поддерживает simd расширение. Свой пример я компилировал ml из пакета visual studio 2008. Ну что могу сказать без отладки - пример не корректный. Во первых, массив на вход должен быть типа double, а у вас байтовый. Кроме того он должен быть комплексным (выход тоже), то есть числа должны чередоваться (re, im, re, im ...) И вы переделали мой код под ifft (для прямого преобразования последний параметр в моей функции -1, это знак степени экспоненты)
0
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 11
07.12.2011, 18:24
Виталий, я скинул первый попавшийся откомпелированный пример,(я их много разных пробовал) и вот чего я сам не понимаю при малом объеме входного буфера пример действительно работает но если объем увеличить скажем до
100h то все - программа падает. По этому я и хотел с вашей помощью разобраться Фурье для меня это нечто новое. Если у вас есть откомпилированный пример на с++ прошу скинуть.У меня ваш код на c++ не компилируется vc 2006 выдает ошибки.'_aligned_malloc' : undeclared identifier
: error C2374: 'i' : redefinition; multiple initialization
: see declaration of 'i'
: error C2065: '_aligned_free' : undeclared identifier
А MASM действительно нужно настраивать чтобы он sse3 понимал.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
08.12.2011, 09:10  [ТС]
странно что не компилируется, может забыли подключить <malloc.h>?
Прикрепляю exe - ник. Исходник выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <malloc.h>
#include <math.h>
#include <stdio.h>
 
extern "C" void FFT_SSE2( double *in_data, double *out_data, int fftFrameSize);
 
const double pi = 3.1415926535897932384626433832795;
int size_data = 1 << 10;    // 1024
 
int main(int argc, char* argv[])
{
    double *in_signal = (double*) _aligned_malloc(sizeof(double)*(size_data<<1), 16);
    double *out_signal = (double*) _aligned_malloc(sizeof(double)*(size_data<<1), 16);
 
    for(int i=0; i<size_data*2; i+=2)
    {
        in_signal[i] = sin(2*pi*1000*i/44100);  
        in_signal[i+1] = .0;
    }
 
    FFT_SSE2(in_signal, out_signal, size_data);
 
    FILE *f = fopen("spec.txt", "w+");
    for(int i=0; i<size_data*2; i+=2)
        fprintf(f, "%.15e%c", sqrt(out_signal[i]*out_signal[i]+out_signal[i+1]*out_signal[i+1]), ' '); 
    fclose(f);
 
    _aligned_free(in_signal);
    _aligned_free(out_signal);
    return 0;
}
программа создает файл spec.txt в который сохраняет амплитудный спектр. Далее я смотрю его в матлабе
load('D:\test\tst_fft\spec.txt');
plot(spec); grid on; axis tight;
График выглядит так (если у вас нет матлаба) максимум соответствует частоте 1 кГц
Миниатюры
Преобразование Фурье на ассемблере  
Вложения
Тип файла: zip tst_fft.zip (3.7 Кб, 31 просмотров)
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
08.12.2011, 11:32  [ТС]
забыл еще один важный момент. Длина входного массива обязательно должна быть степенью двойки, это требование бпф, в моем коде это не проверяется
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2011, 11:32

Преобразование Фурье
Добрый день! Не могли бы вы подбросить рабочий код для преобразования Фурье в Делфи? Нужен код не быстрого преобразования, а обычного....

Преобразование Фурье
Подскажыте пожалста , возможно ли функцию |sin(x)| разложить в ряд фурэ через експотенциалбную формулу... мне нужно написать прогу на с ,...

Преобразование Фурье
Здравствуйте. Как разложить функцию в ряд Фурье (тригонометрическая, комплексная формы) и нарисовать спектры(амплитудный,...

Преобразование Фурье на С++
Рассчитать дискретный спектр сигнала, вывести амплитудный и фазовый спектры. N=71, n1=4, n2=17, n3=19,n4=43. Подскажите пожалуйста, как...

Преобразование Фурье
Здравствуйте! Необходимо провернуть преобразование Фурье модельного сигнала y=50 * sin(2*Pi*50); Насколько я понимаю делается это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru