This repository was archived by the owner on Apr 7, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathchannels_frequency.py
133 lines (100 loc) · 4.09 KB
/
channels_frequency.py
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
import numpy as np
from PyQt5 import QtCore, QtWidgets
class ChannelFrequency:
ax_f_lim = [-6.0, 6.0, -0.25, 1.25]
ax_t_lim = [-2.0, 2.0, -2.0, 6.0]
def widget(self):
try:
return globals()[self.__class__.__name__ + '_Widget'](self)
except KeyError:
return QtWidgets.QLabel('<i>No options available for this channel.</i>')
class ChannelFrequency_Widget(QtWidgets.QWidget):
update_signal = QtCore.pyqtSignal()
def __init__(self, channel):
super().__init__()
self.channel = channel
self.initUI()
# Ideal channel
class Bypass_ChannelFrequency(ChannelFrequency):
def process(self, s):
return s
# Ideal lowpass channel
class IdealLowpass_ChannelFrequency(ChannelFrequency):
def __init__(self, bandwidth=2.0):
self.bandwidth = bandwidth
def process(self, s):
fs = self.system.samp_freq
Ns = len(s)
f = np.arange(-Ns//2, Ns//2) * (fs/Ns)
Bt = self.bandwidth
HC = 1.0 * ((-Bt <= f) & (f < Bt))
S = np.fft.fftshift(np.fft.fft(s)) / fs
R0 = S * HC
r = fs * np.fft.ifft(np.fft.ifftshift(R0))
r = np.real(r)
return r
class IdealLowpass_ChannelFrequency_Widget(ChannelFrequency_Widget):
def initUI(self):
self.bandwidth_text = QtWidgets.QLineEdit()
self.bandwidth_text.editingFinished.connect(
lambda: self._update(float(self.bandwidth_text.text()))
)
self.bandwidth_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.bandwidth_slider.setRange(0, 100)
self.bandwidth_slider.valueChanged[int].connect(
lambda: self._update(self.bandwidth_slider.value() / 10)
)
layout = QtWidgets.QHBoxLayout()
layout.addWidget(QtWidgets.QLabel('Bandwidth [Hz]:'), 1)
layout.addWidget(self.bandwidth_text, 1)
layout.addWidget(self.bandwidth_slider, 2)
self.setLayout(layout)
self._update(self.channel.bandwidth)
def _update(self, value):
self.channel.bandwidth = value
self.bandwidth_text.setText(str(value))
self.bandwidth_slider.setValue(int(10 * value))
self.update_signal.emit()
# First order lowpass channel
class FirstOrderLowpass_ChannelFrequency(ChannelFrequency):
ax_t_lim = [-0.5, 2.0, -2.0, 6.0]
def __init__(self, cutoff_frequency=5.0):
self.cutoff_frequency = cutoff_frequency
def process(self, s):
fs = self.system.samp_freq
Ns = len(s)
f0 = self.cutoff_frequency
f = np.arange(-Ns//2, Ns//2) * (fs/Ns)
HC = 1.0 / (1.0 + 1j * 2.0 * np.pi * f/f0)
S = np.fft.fftshift(np.fft.fft(s)) / fs
R0 = S * HC
r = fs * np.fft.ifft(np.fft.ifftshift(R0))
r = np.real(r)
return r
class FirstOrderLowpass_ChannelFrequency_Widget(ChannelFrequency_Widget):
def initUI(self):
self.cutoff_frequency_text = QtWidgets.QLineEdit()
self.cutoff_frequency_text.editingFinished.connect(
lambda: self._update(float(self.cutoff_frequency_text.text()))
)
self.cutoff_frequency_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.cutoff_frequency_slider.setRange(0, 200)
self.cutoff_frequency_slider.valueChanged[int].connect(
lambda: self._update(self.cutoff_frequency_slider.value() / 10)
)
layout = QtWidgets.QHBoxLayout()
layout.addWidget(QtWidgets.QLabel('Cutoff frequency [Hz]:'), 1)
layout.addWidget(self.cutoff_frequency_text, 1)
layout.addWidget(self.cutoff_frequency_slider, 2)
self.setLayout(layout)
self._update(self.channel.cutoff_frequency)
def _update(self, value):
self.channel.cutoff_frequency = value + 1e-12 # Because of numerical issues
self.cutoff_frequency_text.setText(str(value))
self.cutoff_frequency_slider.setValue(int(10 * value))
self.update_signal.emit()
choices = [
('[Bypass]', Bypass_ChannelFrequency()),
('Ideal lowpass', IdealLowpass_ChannelFrequency()),
('First order lowpass', FirstOrderLowpass_ChannelFrequency()),
]