class Window(QDialog): def __init__(self, parent=None): super().__init__(parent) #測定データ保存先 self.label_Save = QLabel('Save Directory:', self) self.edit_Save = QLineEdit(self) self.edit_Save.setFocusPolicy(Qt.ClickFocus) self.edit_Save.setText(SCRIPT_DIR) self.btn_Save = QPushButton('Open', self) self.btn_Save.setStyleSheet('background-color:white; color:black;') self.btn_Save.clicked.connect(self.showDialog) #測定モードの選択 self.label_Mode = QLabel('Mode:', self) self.combo_Mode = QComboBox(self) self.combo_Mode.addItems(['RSTF', 'SSTF', 'LSTF', 'Mic_Ajust']) #ターゲット self.label_Output = QLabel('Target:', self) self.combo_Output = QComboBox(self) self.combo_Output.addItem("Headphones") #被験者記入欄 self.label_Sub = QLabel('subject:', self) self.edit_Sub = QLineEdit(self) #同期化算数記入欄 self.label_averaging_time = QLabel('Avaraging Times:', self) self.edit_averaging_time = QLineEdit(self) self.edit_averaging_time.setText("10") #測定開始ボタン self.btn_Start = QPushButton('START', self) self.btn_Start.setStyleSheet('background-color:cyan; color:black;') self.btn_Start.setFont(QFont("", 40)) #イメージ self.image1 = QLabel(self) self.image1.setScaledContents(True) self.image1.setPixmap(QPixmap(SCRIPT_DIR+"/.texture/RSTF.png")) #プロット切り替えボタン self.btn_pltChange = QPushButton('↔', self) self.btn_pltChange.setStyleSheet('background-color:white; color:black;') self.btn_pltChange.setFont(QFont("", 28)) self.btn_pltChange.setHidden(True) self.btn_pltChange.clicked.connect(self.plotChange) #ログ self.label_log = QLabel('Log:', self) self.te_log = QTextEdit(self) self.te_log.setReadOnly(True) self.te_log.setStyleSheet('background-color:black;') self.te_log.setTextColor(QColor(0, 255, 0)) self.te_log.setFontPointSize(16) #プロットウィンドウ self.figure1 = plt.figure(figsize=(9, 5), dpi=60) self.axes1 = self.figure1.add_subplot(111) self.axes1.tick_params(labelsize=15) self.canvas1 = FigureCanvas(self.figure1) self.canvas1.setParent(self) #プロットウィンドウ2 self.figure2 = plt.figure(figsize=(9, 5), dpi=60) self.axes2 = self.figure2.add_subplot(111) self.axes2.tick_params(labelsize=15) self.canvas2 = FigureCanvas(self.figure2) self.canvas2.setParent(self) #ナビゲーションツール self.toolbar1 = NavigationToolbar(self.canvas1, self) self.toolbar1.setGeometry(800, 80, 20, 30) self.toolbar2 = NavigationToolbar(self.canvas2, self) self.toolbar2.setGeometry(800, 390, 20, 30) self.btn_Start.clicked.connect(self.measure) #ウィジェットイベント self.combo_Mode.currentIndexChanged.connect(self.wiget_setting) self.wigets_layout() def showDialog(self): frame = QFileDialog.getExistingDirectory(self) if frame != "": self.edit_Save.setText(frame+'/') #各ウィジェットの配置 def wigets_layout(self): x1=20; y1=350;y2=380 x2=150;y3=450;y4=480 self.setGeometry(300,300,900,800) #ウィンドウサイズ self.image1.setGeometry(20, 60, 250, 250) self.label_Save.move(x1, 10) self.edit_Save.setGeometry(130, 10, 650, 20) self.btn_Save.setGeometry(800, 10, 80, 20) self.label_Mode.move(x1, y1) self.combo_Mode.setGeometry(x1-3, y2, 120, 30) self.label_Output.move(x2, y1) self.combo_Output.setGeometry(x2-3, y2, 140, 30) self.label_Sub.move(x1, y3) self.edit_Sub.setGeometry(x1, y4, 100, 20) self.label_averaging_time.move(x2, y3) self.edit_averaging_time.setGeometry(x2, y4, 100, 20) self.btn_Start.setGeometry(60, 540, 180, 80) self.label_log.move(50, 640) self.te_log.setGeometry(50, 670, 800, 120) self.canvas1.move(300, 50) self.canvas2.move(300, 360) self.btn_pltChange.setGeometry(860, 55, 30, 30) #測定モードごとのウィジェットの設定 def wiget_setting(self): self.combo_Output.clear() self.edit_Sub.setReadOnly(True) #RSTF if self.combo_Mode.currentIndex() is 0: self.combo_Output.addItem("Headphones") self.edit_Sub.setReadOnly(False) self.edit_averaging_time.setText("10") self.image1.setPixmap(QPixmap(SCRIPT_DIR+"/.texture/RSTF.png")) #SSTF elif self.combo_Mode.currentIndex() is 1: self.combo_Output.addItems(['angle: 0-85', 'angle: 90-175', 'angle: 180-265', 'angle: 270-355', 'ITD_Check']) self.edit_Sub.setReadOnly(False) self.edit_averaging_time.setText("10") self.image1.setPixmap(QPixmap(SCRIPT_DIR+"/.texture/SSTF.png")) #LSTF elif self.combo_Mode.currentIndex() is 2: self.combo_Output.addItems('Speaker No.' + str(n) for n in range(1, 19)) self.edit_Sub.clear() self.edit_averaging_time.setText("10") self.image1.setPixmap(QPixmap(SCRIPT_DIR+"/.texture/LSTF.png")) #MicAjust elif self.combo_Mode.currentIndex() is 3: self.combo_Output.addItem("Speaker No.1") self.edit_Sub.clear() self.image1.setPixmap(QPixmap(SCRIPT_DIR+"")) #測定 def measure(self): self.averaging_times = self.edit_averaging_time.text() self.speaker_index = self.combo_Output.currentIndex() self.subject = self.edit_Sub.text() self.outdir = self.edit_Save.text() + "/" + self.subject self.Reverse = False #プロット切り替えスイッチ self.btn_pltChange.setHidden(False) #RSTF if self.combo_Mode.currentIndex() is 0: if self.averaging_times is "": QMessageBox.warning(self, "Message", u"SANnum is invalid or empty") return if self.subject is "": QMessageBox.warning(self, "Message", u"subject Name is empty") return measure.RSTF(self.subject, self.averaging_times, 1, 255, 3801, 4823, self.outdir) self.te_log.append('cinv_cRSTF_L.DDB and cinv_cRSTF_R.DDB are measured. (' + datetime.now().strftime("%H:%M:%S") + ')') self.plotChange() #SSTF elif self.combo_Mode.currentIndex() is 1: self.btn_pltChange.setHidden(True) if os.path.exists("/Volumes/share/angle") is False: QMessageBox.warning(self, "Message", u"Speaker selector is not connecting.") return if self.averaging_times is "": QMessageBox.warning(self, "Message", u"SANnum is invalid or empty") return if self.subject is "": QMessageBox.warning(self, "Message", u"subject Name is empty") return if self.speaker_index is 4: with open('/Volumes/share/angle', 'w') as select: select.write("1") measure.SSTF(self.subject, self.averaging_times, 'check', 150, 405, self.outdir) self.plot(self.outdir + '/SSTF/cSSTF_check_L.DDB' , self.outdir + '/SSTF/cSSTF_check_R.DDB') #/SSTF/cSSTF_000_R.DDBから/SSTF/cSSTF_check_R.DDBに名称変更 return for n in range(18): angle = self.speaker_index * 90 + n * 5 with open('/Volumes/share/angle', 'w') as select: select.write(str(n+1)) measure.SSTF(self.subject, self.averaging_times, angle, 150, 405, self.outdir) self.te_log.append('SSTF_' + str(angle) + '_L.DDB and SSTF_' + str(angle) + '_R.DDB are measured. ('+ datetime.now().strftime("%H:%M:%S") + ')') self.plot(self.outdir + '/SSTF/cSSTF_' + str(angle) + '_L.DDB' , self.outdir + '/SSTF/cSSTF_' + str(angle) + '_R.DDB') self.canvas1.flush_events() self.canvas2.flush_events() #LSTF elif self.combo_Mode.currentIndex() is 2: if os.path.exists("/Volumes/share/angle") is False: QMessageBox.warning(self, "Message", u"Speaker selector is not connecting.") return if self.averaging_times is "": QMessageBox.warning(self, "Message", u"SANnum is invalid or empty") return with open('/Volumes/share/angle', 'w') as select: select.write(str(self.speaker_index+1)) measure.LSTF(self.speaker_index+1, self.averaging_times, 150, 405, 3800, 4823, self.edit_Save.text()) self.te_log.append('/LSTF_' + str(self.speaker_index+1) + '.DDB is measured. (' + datetime.now().strftime("%H:%M:%S") + ')') self.plotChange() #MicAjust elif self.combo_Mode.currentIndex() is 3: with open('/Volumes/share/angle', 'w') as select: select.write("1") measure.mic_ajust() self.te_log.append('rec_L.DDB and rec_R.DDB are measured. ('+ datetime.now().strftime("%H:%M:%S") + ')') self.plotChange() # elif self.combo_Mode.currentIndex() is 4: # cpyconv.closedloop() # with open(SCRIPT_DIR+"/DOUKI_START", 'r') as douki_start: iodelay = douki_start.read() # QMessageBox.about(self, "Message", "The I/O delay is "+iodelay+" sample") #データのプロット def plot(self, file_L, file_R): data_bin = open(file_L, 'rb').read() data = np.fromstring(data_bin,dtype=np.float64) if file_R != None: data_bin2 = open(file_R, 'rb').read() data2 = np.fromstring(data_bin2,dtype=np.float64) #プロット1 self.axes1.clear() self.axes1.set_title('Impulse Response', fontsize=15) self.axes1.set_xlabel("Sample", fontsize=15) self.axes1.set_ylabel("Level", fontsize=15) self.axes1.plot(data, '-', label=re.search("(.*)/(.*)", file_L).group(2)) if file_R != None: self.axes1.plot(data2, '-', label=re.search("(.*)/(.*)", file_R).group(2)) self.axes1.legend(bbox_to_anchor=(0., 1.02, 1., .102),borderaxespad=-0.2) self.canvas1.draw() #プロット2 self.axes2.clear() self.axes2.set_title('Frequency Characteristic', fontsize=15) self.axes2.set_xlabel("Frequency [Hz]", fontsize=15) self.axes2.set_ylabel("Amplitude [dB]", fontsize=15) self.axes2.set_xlim(100, 24000) self.axes2.set_xscale('log') N = 255 x = np.fft.fftfreq(N*2,d=1.0/48000)*2 freq = np.fft.fft(data[0:N]) data_amplitude = [np.sqrt(c.real ** 2 + c.imag ** 2 ) for c in freq] data_decibel = 10.0 * np.log10(data_amplitude) self.axes2.plot(x[0:N], data_decibel, '-', label=re.search("(.*)/(.*)", file_L).group(2)) if file_R != None: freq2 = np.fft.fft(data2[0:N]) data_amplitude2 = [np.sqrt(c.real ** 2 + c.imag ** 2 ) for c in freq2] data_decibel2 = 10.0 * np.log10(data_amplitude2) self.axes2.plot(x[0:N], data_decibel2, '-', label=re.search("(.*)/(.*)", file_R).group(2)) self.axes2.legend(bbox_to_anchor=(0., 1.02, 1., .102),borderaxespad=-0.2) self.canvas2.draw() def plotChange(self): if self.Reverse is False: #RSTF if self.combo_Mode.currentIndex() is 0: self.plot(self.outdir + '/RSTF/cRSTF_L.DDB' , self.outdir + '/RSTF/cRSTF_R.DDB') #LSTF elif self.combo_Mode.currentIndex() is 2: self.plot(self.edit_Save.text() + '/LSTF/cLSTF_' + str(self.speaker_index+1) + '.DDB', None) #MicAjust elif self.combo_Mode.currentIndex() is 3: self.plot('/tmp/rec_L.DDB', '/tmp/rec_R.DDB') self.Reverse = True elif self.Reverse is True: #RSTF if self.combo_Mode.currentIndex() is 0: self.plot(self.outdir + '/RSTF/cinv_cRSTF_L.DDB' , self.outdir + '/RSTF/cinv_cRSTF_R.DDB') #LSTF elif self.combo_Mode.currentIndex() is 2: self.plot(self.edit_Save.text() + '/LSTF/cinv_cLSTF_' + str(self.speaker_index+1) + '.DDB', None) #MicAjust elif self.combo_Mode.currentIndex() is 3: self.plot('/tmp/rec_R.DDB', '/tmp/rec_L.DDB') self.Reverse = False #ウィンドウ内の座標を表示 def mousePressEvent(self, event): print('x='+ str(event.x()) + ', y=' + str(event.y()))
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1112, 857) MainWindow.setFixedSize(1112, 817) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(12) font.setBold(True) font.setWeight(75) MainWindow.setFont(font) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(760, 280, 341, 321)) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(9) font.setBold(True) font.setWeight(75) self.tableWidget.setFont(font) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(2) self.tableWidget.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(1, item) self.groupBox = QtWidgets.QGroupBox(self.centralwidget) self.groupBox.setGeometry(QtCore.QRect(20, 10, 731, 671)) font = QtGui.QFont() font.setPointSize(9) self.groupBox.setFont(font) self.groupBox.setObjectName("groupBox") self.widget = PlotCanvas(self.groupBox) self.widget.setGeometry(QtCore.QRect(10, 40, 711, 621)) font = QtGui.QFont() font.setFamily("宋体") font.setPointSize(7) font.setBold(False) font.setWeight(50) self.widget.setFont(font) self.widget.setObjectName("widget") self.widget_3 = NavigationToolbar(self.widget, self.groupBox) self.widget_3.setGeometry(QtCore.QRect(10, 10, 321, 31)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.widget_3.setFont(font) self.widget_3.setObjectName("widget_3") self.pushButton_3 = QtWidgets.QPushButton(self.groupBox) self.pushButton_3.setGeometry(QtCore.QRect(648, 13, 75, 23)) self.pushButton_3.setObjectName("pushButton_3") self.pushButton_4 = QtWidgets.QPushButton(self.groupBox) self.pushButton_4.setGeometry(QtCore.QRect(570, 13, 75, 23)) self.pushButton_4.setObjectName("pushButton_4") self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_3.setGeometry(QtCore.QRect(760, 10, 341, 71)) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(9) font.setBold(True) font.setWeight(75) self.groupBox_3.setFont(font) self.groupBox_3.setObjectName("groupBox_3") self.horizontalLayoutWidget = QtWidgets.QWidget(self.groupBox_3) self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 20, 331, 41)) self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") self.horizontalLayout = QtWidgets.QHBoxLayout( self.horizontalLayoutWidget) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit.setObjectName("lineEdit") self.horizontalLayout.addWidget(self.lineEdit) self.pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget) self.pushButton.setObjectName("pushButton") self.horizontalLayout.addWidget(self.pushButton) self.groupBox_5 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_5.setGeometry(QtCore.QRect(20, 680, 731, 121)) font = QtGui.QFont() font.setPointSize(9) self.groupBox_5.setFont(font) self.groupBox_5.setObjectName("groupBox_5") self.textBrowser = QtWidgets.QTextBrowser(self.groupBox_5) self.textBrowser.setGeometry(QtCore.QRect(10, 20, 711, 91)) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.textBrowser.setFont(font) self.textBrowser.setObjectName("textBrowser") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(760, 240, 341, 31)) self.pushButton_2.setObjectName("pushButton_2") self.groupBox_4 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_4.setGeometry(QtCore.QRect(760, 90, 341, 141)) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(9) font.setBold(True) font.setWeight(75) self.groupBox_4.setFont(font) self.groupBox_4.setObjectName("groupBox_4") self.label = QtWidgets.QLabel(self.groupBox_4) self.label.setGeometry(QtCore.QRect(10, 20, 54, 21)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.label.setFont(font) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.groupBox_4) self.label_2.setGeometry(QtCore.QRect(180, 20, 54, 21)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.label_2.setFont(font) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.groupBox_4) self.label_3.setGeometry(QtCore.QRect(10, 60, 54, 21)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.label_3.setFont(font) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.groupBox_4) self.label_4.setGeometry(QtCore.QRect(180, 60, 91, 21)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.label_4.setFont(font) self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(self.groupBox_4) self.label_5.setGeometry(QtCore.QRect(10, 100, 81, 21)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.label_5.setFont(font) self.label_5.setObjectName("label_5") self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox_4) self.lineEdit_2.setGeometry(QtCore.QRect(80, 20, 51, 20)) self.lineEdit_2.setObjectName("lineEdit_2") self.lineEdit_3 = QtWidgets.QLineEdit(self.groupBox_4) self.lineEdit_3.setGeometry(QtCore.QRect(270, 20, 51, 20)) self.lineEdit_3.setObjectName("lineEdit_3") self.lineEdit_4 = QtWidgets.QLineEdit(self.groupBox_4) self.lineEdit_4.setGeometry(QtCore.QRect(80, 60, 51, 20)) self.lineEdit_4.setObjectName("lineEdit_4") self.lineEdit_5 = QtWidgets.QLineEdit(self.groupBox_4) self.lineEdit_5.setGeometry(QtCore.QRect(270, 60, 51, 20)) self.lineEdit_5.setObjectName("lineEdit_5") self.radioButton = QtWidgets.QRadioButton(self.groupBox_4) self.radioButton.setGeometry(QtCore.QRect(120, 100, 61, 16)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.radioButton.setFont(font) self.radioButton.setObjectName("radioButton") self.radioButton_2 = QtWidgets.QRadioButton(self.groupBox_4) self.radioButton_2.setGeometry(QtCore.QRect(230, 100, 91, 16)) font = QtGui.QFont() font.setFamily("宋体") font.setBold(False) font.setWeight(50) self.radioButton_2.setFont(font) self.radioButton_2.setObjectName("radioButton_2") self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser_2.setGeometry(QtCore.QRect(760, 610, 341, 191)) font = QtGui.QFont() font.setPointSize(9) font.setBold(False) font.setWeight(50) self.textBrowser_2.setFont(font) self.textBrowser_2.setObjectName("textBrowser_2") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1112, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "DataViewer")) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "文件名")) item = self.tableWidget.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "平均交叉关联")) self.groupBox.setTitle(_translate("MainWindow", "图表")) self.pushButton_3.setText(_translate("MainWindow", "刷新")) self.pushButton_4.setText(_translate("MainWindow", "交叉关联")) self.groupBox_3.setTitle(_translate("MainWindow", "数据源")) self.pushButton.setText(_translate("MainWindow", "数据文件夹")) self.groupBox_5.setTitle(_translate("MainWindow", "消息")) self.pushButton_2.setText(_translate("MainWindow", "分析")) self.groupBox_4.setTitle(_translate("MainWindow", "设置")) self.label.setText(_translate("MainWindow", "强度阈值:")) self.label_2.setText(_translate("MainWindow", "寻峰阈值:")) self.label_3.setText(_translate("MainWindow", "寻峰数目:")) self.label_4.setText(_translate("MainWindow", "匹配容差(%):")) self.label_5.setText(_translate("MainWindow", "交叉关联算法:")) self.radioButton.setText(_translate("MainWindow", "Raw")) self.radioButton_2.setText(_translate("MainWindow", "Peaks"))