Форум программистов, компьютерный форум, киберфорум
Konst2016
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Попытки работать с Фурье преобразованием

Запись от Konst2016 размещена 19.07.2020 в 13:33

19//07//2020
Привет!Начал немного изучать преобразование Фурье и для опытов опять использую элементы виртуальной машины:
Основной код:
Python
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
import numpy as np
from util import get_logger
import logging
 
Forward=1
Backward=-1
import math
import matplotlib.pyplot as plt
 
def plot(_file:str,x:list,y:list,logger:logging.Logger)->None:
    
    fig:plt.Figure=None
    ax:plt.Axes=None
    fig, ax=plt.subplots()
    ax.plot(x,y)
    plt.xlabel('Gercs')
    plt.ylabel('Amplitude')
    ax.legend()
    plt.savefig(_file)
    print("Graphic saved")
    logger.info("Graphic saved")
    plt.show()
 
def DFT_slow(x):
    x=np.asarray(x, dtype=float)
    
    N=x.shape[0]
    
    n=np.arange(N)
    
    k=n.reshape((N,1))
    
    M=np.exp(-2j * np.pi * k * n / N)
    
    dot_=np.dot(M, x)
    return dot_
       
 
#def dft(data:list, direction:int)->tuple:
    #n = len(data) # Сколько элементов в data
    #arg = 0
    #cos = 0
    #sin = 0
    #dst = [Complex(0,0)] * n
    #for i in range(n):
        #arg=- direction * 2.0 *math.pi * i / n # i индекс данного сигнала в data
        
        #for j in range(n):
            #cos = math.cos( j * arg )
            #sin = math.sin( j * arg )
            #dst[i].real+=(data[j].real* cos - data[j].imag * sin)
            #dst[i].imag+=(data[j].real * sin + data[j].imag * cos)
    #if direction==Forward:
        #for i in range(n):
            #data[i].real=dst[i].real/n
            #data[i].imag=dst[i].imag        
    #return dst
 
 
(push_i, push_fl, push_str, push_obj,dft_,rfft_,fft_,dft_slow,plot_,fftfreq_) = range(9)
 
 
def vm(buffer, loger=None, date=None):
    len_ = 25
    data=None
    out=None
    if loger:
        loger.info(f'Log started {date}')
    vm_is_running = True
    ip = 0
    sp = -1
    steck = [0] * len_
    op = buffer[ip]
    while ip < len(buffer):
        if op == push_i:
            sp += 1
            ip += 1
            steck[sp] = int(buffer[ip])  
        elif op == push_fl:
            sp += 1
            ip += 1
            steck[sp] = float(buffer[ip]) 
        elif op == push_str:
            sp += 1
            ip += 1
            steck[sp] = buffer[ip]
        elif op == push_obj:
            sp += 1
            ip += 1
            steck[sp] = buffer[ip]
        elif op==dft_:
            data=steck[sp]
            sp-=1
            direction=steck[sp]
            sp-=1
            out=dft(data,direction)
            print("out dft")
            for i in out:
               print(i, end=' ')
            print()   
        elif op==rfft_:
            data=steck[sp]
            sp-=1
            out=np.fft.rfft(data)
            print("out np-fft-rfft",out) 
            loger.info(f'signal________"{data}\nout np-fft-fft{out}')            
        elif op==fft_:
            data=steck[sp]
            sp-=1
            print("signal________",data)
            out=np.fft.fft(data)
            print("out np-fft-fft",out) 
            loger.info(f'signal________"{data}\nout np-fft-fft{out}')
        elif op==dft_slow:
            data=steck[sp]
            sp-=1
            print("signal________",data)
            out=DFT_slow(data)
            print("out DFT_slow",out) 
            loger.info(f'signal________"{data}\nout DFT_slow{out}') 
        elif op==plot_:
            x=range(len(data))
            y=np.abs(out)/len(data)
            plot("./graphic/gr.png",x,y,loger)
            
        ip += 1
        if ip > (len(buffer) - 1):
            return
        try:
            op = buffer[ip]
        except IndexError:
            raise RuntimeError('Maybe arg of bytecode skipped')
 
 
if __name__ == '__main__':
    loger,date=get_logger("debug","log.txt",__name__)
    signal = np.array([1, 2, 3, 4, 3, 2])
    signal1=np.array([0.1,0.001,0.9,2,0.9])
    p1 = (push_obj,signal,rfft_,push_obj,signal,fft_)
    p2=(push_obj,signal,dft_slow,plot_)
    p3=(push_obj,signal1,dft_slow,plot_)
    vm(p2, loger, date)
При p2 показан график функции:
Нажмите на изображение для увеличения
Название: grp2.png
Просмотров: 222
Размер:	19.0 Кб
ID:	6361
Размещено в Без категории
Просмотров 237 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Curry
    Быстрое преобразование Фурье : https://ru.wikipedia.org/wiki/... 1%8C%D0%B5
    Оконные функции https://ru.wikipedia.org/wiki/... 1%8C%D0%B5
    на практике используют именно это, а не так, в лоб. И, в целом, цифровая обработка сигналов - огромное поле для освоения.
    Запись от Curry размещена 22.07.2020 в 14:20 Curry вне форума
  2. Старый комментарий
    Лучше в лоб!)
    Запись от Konst2016 размещена 26.07.2020 в 14:37 Konst2016 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.