From 86b01252d43310e28865c8e9af09f5034c988e76 Mon Sep 17 00:00:00 2001 From: Marek Blok <Marek.Blok@pg.edu.pl> Date: Fri, 25 Jun 2021 22:39:30 +0200 Subject: [PATCH] Initial version of Ex2 --- .gitignore | 10 + {Cw1 => Ex1}/.vscode/c_cpp_properties.json | 0 {Cw1 => Ex1}/.vscode/launch.json | 0 {Cw1 => Ex1}/.vscode/tasks.json | 0 {Cw1 => Ex1}/DSPElib.wav | Bin {Cw1 => Ex1}/Ex1_task3.cbp | 0 {Cw1 => Ex1}/Ex1_task3.cpp | 2 +- {Cw1 => Ex1}/Makefile | 0 {Cw1 => Ex1}/Makefile.main | 0 {Cw1 => Ex1}/ex_1_sig_1.wav | Bin {Cw1 => Ex1}/ex_1_sig_2.wav | Bin {Cw1 => Ex1}/matlab/PERgraf.m | 0 {Cw1 => Ex1}/matlab/SPECgraf.m | 0 {Cw1 => Ex1}/matlab/design_task_2.m | 0 {Cw1 => Ex1}/matlab/ex1_task2.coef | Bin {Cw1 => Ex1}/matlab/perGUI.m | 0 {Cw1 => Ex1}/matlab/rcos4.m | 0 {Cw1 => Ex1}/matlab/readaudiofile.m | 0 {Cw1 => Ex1}/matlab/readme.txt | 0 {Cw1 => Ex1}/matlab/save_filter_coef.m | 0 {Cw1 => Ex1}/rundot.bat | 0 Ex2/.vscode/c_cpp_properties.json | 65 + Ex2/.vscode/launch.json | 29 + Ex2/.vscode/tasks.json | 33 + Ex2/DSPElib.wav | Bin 0 -> 130738 bytes Ex2/Ex2_task1.cbp | 38 + Ex2/Ex2_task1.cpp | 147 ++ Ex2/Makefile | 85 ++ Ex2/Makefile.main | 60 + Ex2/matlab/PERgraf.m | 1565 ++++++++++++++++++++ Ex2/matlab/SPECgraf.m | 1436 ++++++++++++++++++ Ex2/matlab/design_task_2.m | 24 + Ex2/matlab/design_tast_1.m | 26 + Ex2/matlab/ex2_task1.coef | Bin 0 -> 326 bytes Ex2/matlab/ex2_task2.coef | Bin 0 -> 170 bytes Ex2/matlab/perGUI.m | 892 +++++++++++ Ex2/matlab/rcos4.m | 51 + Ex2/matlab/readaudiofile.m | 215 +++ Ex2/matlab/readme.txt | 1 + Ex2/matlab/save_filter_coef.m | 226 +++ Ex2/rundot.bat | 5 + 41 files changed, 4909 insertions(+), 1 deletion(-) rename {Cw1 => Ex1}/.vscode/c_cpp_properties.json (100%) rename {Cw1 => Ex1}/.vscode/launch.json (100%) rename {Cw1 => Ex1}/.vscode/tasks.json (100%) rename {Cw1 => Ex1}/DSPElib.wav (100%) rename {Cw1 => Ex1}/Ex1_task3.cbp (100%) rename {Cw1 => Ex1}/Ex1_task3.cpp (98%) rename {Cw1 => Ex1}/Makefile (100%) rename {Cw1 => Ex1}/Makefile.main (100%) rename {Cw1 => Ex1}/ex_1_sig_1.wav (100%) rename {Cw1 => Ex1}/ex_1_sig_2.wav (100%) rename {Cw1 => Ex1}/matlab/PERgraf.m (100%) rename {Cw1 => Ex1}/matlab/SPECgraf.m (100%) rename {Cw1 => Ex1}/matlab/design_task_2.m (100%) rename {Cw1 => Ex1}/matlab/ex1_task2.coef (100%) rename {Cw1 => Ex1}/matlab/perGUI.m (100%) rename {Cw1 => Ex1}/matlab/rcos4.m (100%) rename {Cw1 => Ex1}/matlab/readaudiofile.m (100%) rename {Cw1 => Ex1}/matlab/readme.txt (100%) rename {Cw1 => Ex1}/matlab/save_filter_coef.m (100%) rename {Cw1 => Ex1}/rundot.bat (100%) create mode 100644 Ex2/.vscode/c_cpp_properties.json create mode 100644 Ex2/.vscode/launch.json create mode 100644 Ex2/.vscode/tasks.json create mode 100644 Ex2/DSPElib.wav create mode 100644 Ex2/Ex2_task1.cbp create mode 100644 Ex2/Ex2_task1.cpp create mode 100644 Ex2/Makefile create mode 100644 Ex2/Makefile.main create mode 100644 Ex2/matlab/PERgraf.m create mode 100644 Ex2/matlab/SPECgraf.m create mode 100644 Ex2/matlab/design_task_2.m create mode 100644 Ex2/matlab/design_tast_1.m create mode 100644 Ex2/matlab/ex2_task1.coef create mode 100644 Ex2/matlab/ex2_task2.coef create mode 100644 Ex2/matlab/perGUI.m create mode 100644 Ex2/matlab/rcos4.m create mode 100644 Ex2/matlab/readaudiofile.m create mode 100644 Ex2/matlab/readme.txt create mode 100644 Ex2/matlab/save_filter_coef.m create mode 100644 Ex2/rundot.bat diff --git a/.gitignore b/.gitignore index de23a0c..604dbce 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ Cw1/Ex1_task3_dbg.exe Cw1/Ex1_task3_rls.exe Cw1/Ex1_task3.dot Cw1/Ex1_task3.gif +Cw1/Ex1_task3.layout Cw1/ex1_task3.wav Cw1/log_file.txt Cw1/out_win_dbg @@ -9,3 +10,12 @@ Cw1/out_win_rls Cw1/out_linux_dbg Cw1/out_linux_rls +Cw2/Ex2_task1_dbg.exe +Cw2/Ex2_task1.dot +Cw2/ex2_task1.wav +Cw2/Ex2_task1.layout +Cw2/log_file.txt +Cw2/out_win_dbg +Cw2/out_win_rls +Cw2/out_linux_dbg +Cw2/out_linux_rls diff --git a/Cw1/.vscode/c_cpp_properties.json b/Ex1/.vscode/c_cpp_properties.json similarity index 100% rename from Cw1/.vscode/c_cpp_properties.json rename to Ex1/.vscode/c_cpp_properties.json diff --git a/Cw1/.vscode/launch.json b/Ex1/.vscode/launch.json similarity index 100% rename from Cw1/.vscode/launch.json rename to Ex1/.vscode/launch.json diff --git a/Cw1/.vscode/tasks.json b/Ex1/.vscode/tasks.json similarity index 100% rename from Cw1/.vscode/tasks.json rename to Ex1/.vscode/tasks.json diff --git a/Cw1/DSPElib.wav b/Ex1/DSPElib.wav similarity index 100% rename from Cw1/DSPElib.wav rename to Ex1/DSPElib.wav diff --git a/Cw1/Ex1_task3.cbp b/Ex1/Ex1_task3.cbp similarity index 100% rename from Cw1/Ex1_task3.cbp rename to Ex1/Ex1_task3.cbp diff --git a/Cw1/Ex1_task3.cpp b/Ex1/Ex1_task3.cpp similarity index 98% rename from Cw1/Ex1_task3.cpp rename to Ex1/Ex1_task3.cpp index 17321af..d4ff011 100644 --- a/Cw1/Ex1_task3.cpp +++ b/Ex1/Ex1_task3.cpp @@ -1,4 +1,4 @@ -/*! Laboratory: Advanced signal processing of telecommunication signals +/*! Laboratory: Advanced signal processing of digital telecommunications * (Zaawansowane przetwarzanie sygnaĹĂłw telekomunikacji cyfrowej) * Ex. 1. task 3. * - impulse response loaded from file diff --git a/Cw1/Makefile b/Ex1/Makefile similarity index 100% rename from Cw1/Makefile rename to Ex1/Makefile diff --git a/Cw1/Makefile.main b/Ex1/Makefile.main similarity index 100% rename from Cw1/Makefile.main rename to Ex1/Makefile.main diff --git a/Cw1/ex_1_sig_1.wav b/Ex1/ex_1_sig_1.wav similarity index 100% rename from Cw1/ex_1_sig_1.wav rename to Ex1/ex_1_sig_1.wav diff --git a/Cw1/ex_1_sig_2.wav b/Ex1/ex_1_sig_2.wav similarity index 100% rename from Cw1/ex_1_sig_2.wav rename to Ex1/ex_1_sig_2.wav diff --git a/Cw1/matlab/PERgraf.m b/Ex1/matlab/PERgraf.m similarity index 100% rename from Cw1/matlab/PERgraf.m rename to Ex1/matlab/PERgraf.m diff --git a/Cw1/matlab/SPECgraf.m b/Ex1/matlab/SPECgraf.m similarity index 100% rename from Cw1/matlab/SPECgraf.m rename to Ex1/matlab/SPECgraf.m diff --git a/Cw1/matlab/design_task_2.m b/Ex1/matlab/design_task_2.m similarity index 100% rename from Cw1/matlab/design_task_2.m rename to Ex1/matlab/design_task_2.m diff --git a/Cw1/matlab/ex1_task2.coef b/Ex1/matlab/ex1_task2.coef similarity index 100% rename from Cw1/matlab/ex1_task2.coef rename to Ex1/matlab/ex1_task2.coef diff --git a/Cw1/matlab/perGUI.m b/Ex1/matlab/perGUI.m similarity index 100% rename from Cw1/matlab/perGUI.m rename to Ex1/matlab/perGUI.m diff --git a/Cw1/matlab/rcos4.m b/Ex1/matlab/rcos4.m similarity index 100% rename from Cw1/matlab/rcos4.m rename to Ex1/matlab/rcos4.m diff --git a/Cw1/matlab/readaudiofile.m b/Ex1/matlab/readaudiofile.m similarity index 100% rename from Cw1/matlab/readaudiofile.m rename to Ex1/matlab/readaudiofile.m diff --git a/Cw1/matlab/readme.txt b/Ex1/matlab/readme.txt similarity index 100% rename from Cw1/matlab/readme.txt rename to Ex1/matlab/readme.txt diff --git a/Cw1/matlab/save_filter_coef.m b/Ex1/matlab/save_filter_coef.m similarity index 100% rename from Cw1/matlab/save_filter_coef.m rename to Ex1/matlab/save_filter_coef.m diff --git a/Cw1/rundot.bat b/Ex1/rundot.bat similarity index 100% rename from Cw1/rundot.bat rename to Ex1/rundot.bat diff --git a/Ex2/.vscode/c_cpp_properties.json b/Ex2/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..159c03c --- /dev/null +++ b/Ex2/.vscode/c_cpp_properties.json @@ -0,0 +1,65 @@ +{ + "configurations": [ + { + "name": "Windows-Release", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/../../_DSPE_lib_minGW_/MinGW-W64_8.1.0/include/**" + ], + "defines": [ + "WIN32", + "__DEBUG__=0" + ], + "compilerPath": "gcc.exe", + "cStandard": "c11", + "cppStandard": "c++11", + "intelliSenseMode": "gcc-x64" + }, + { + "name": "Linux-Release", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/../../_DSPE_lib_minGW_/MinGW-W64_8.1.0/include/**" + ], + "defines": [ + "WIN32", + "__DEBUG__=0" + ], + "compilerPath": "gcc.exe", + "cStandard": "c11", + "cppStandard": "c++11", + "intelliSenseMode": "gcc-x64" + }, + { + "name": "Windows-Debug", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/../../_DSPE_lib_minGW_/MinGW-W64_8.1.0/include/**" + ], + "defines": [ + "WIN32", + "__DEBUG__=1" + ], + "compilerPath": "gcc.exe", + "cStandard": "c11", + "cppStandard": "c++11", + "intelliSenseMode": "gcc-x64" + }, + { + "name": "Linux-Debug", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/../../_DSPE_lib_minGW_/MinGW-W64_8.1.0/include/**" + ], + "defines": [ + "WIN32", + "__DEBUG__=1" + ], + "compilerPath": "gcc.exe", + "cStandard": "c11", + "cppStandard": "c++11", + "intelliSenseMode": "gcc-x64" + } +], + "version": 4 +} \ No newline at end of file diff --git a/Ex2/.vscode/launch.json b/Ex2/.vscode/launch.json new file mode 100644 index 0000000..60af171 --- /dev/null +++ b/Ex2/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(gdb) Ex2 â debug run ", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/Ex2_task1_dbg.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", +// "miDebuggerPath": "d:/CodeBlocks_20_03/MinGW/bin/gdb.exe", + "setupCommands": [ + { + "description": "WĹÄ cz formatowanie kodu dla gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "Build Ex2_task1.cpp" + } + ] +} \ No newline at end of file diff --git a/Ex2/.vscode/tasks.json b/Ex2/.vscode/tasks.json new file mode 100644 index 0000000..41052d6 --- /dev/null +++ b/Ex2/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + // https://code.visualstudio.com/docs/editor/tasks + // ${command:cpptools.activeConfigName} + "tasks": [ + { + "label": "Build Ex2_task1.cpp", + "type": "shell", + "command": "make build -f Makefile.main FILE=Ex2_task1 VS_CFG=${command:cpptools.activeConfigName}", + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "echo": true + }, + "problemMatcher": "$gcc" + }, + { + "label": "Clean Ex2_task1.cpp", + "type": "shell", + "command": "make clean -f Makefile.main VS_CFG=${command:cpptools.activeConfigName}", + "group": "build", + "presentation": { + "echo": true + }, + "problemMatcher": "$gcc" + } + + ] +} \ No newline at end of file diff --git a/Ex2/DSPElib.wav b/Ex2/DSPElib.wav new file mode 100644 index 0000000000000000000000000000000000000000..061adc48e0802faf131b45941c4c13b56b41b19a GIT binary patch literal 130738 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 TR`5T(Q<7UXQ4-?J!0G=08ad6h literal 0 HcmV?d00001 diff --git a/Ex2/Ex2_task1.cbp b/Ex2/Ex2_task1.cbp new file mode 100644 index 0000000..13e9ca7 --- /dev/null +++ b/Ex2/Ex2_task1.cbp @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> +<CodeBlocks_project_file> + <FileVersion major="1" minor="6" /> + <Project> + <Option title="Ex2_task1" /> + <Option pch_mode="2" /> + <Option compiler="gcc" /> + <Build> + <Target title="default"> + <Option output="Ex2_task1" prefix_auto="1" extension_auto="1" /> + <Option type="1" /> + <Option compiler="gcc" /> + </Target> + </Build> + <Compiler> + <Add option="-std=c++0x" /> + <Add option="-m32" /> + <Add option="-g" /> + <Add option="-DWIN32" /> + <Add directory="../DSPElib/CodeBlocks-m32_TDM_5.1.0/include" /> + <Add directory="../DSPElib/CodeBlocks-m32_TDM_5.1.0/dbg" /> + </Compiler> + <Linker> + <Add option="-static-libgcc" /> + <Add option="-m32" /> + <Add library="DSPE" /> + <Add library="winmm" /> + <Add directory="../DSPElib/CodeBlocks-m32_TDM_5.1.0/dbg" /> + </Linker> + <Unit filename="Ex2_task1.cpp" /> + <Extensions> + <code_completion /> + <envvars /> + <debugger /> + <lib_finder disable_auto="1" /> + </Extensions> + </Project> +</CodeBlocks_project_file> diff --git a/Ex2/Ex2_task1.cpp b/Ex2/Ex2_task1.cpp new file mode 100644 index 0000000..80bb42a --- /dev/null +++ b/Ex2/Ex2_task1.cpp @@ -0,0 +1,147 @@ +/*! Laboratory: Advanced signal processing of digital telecommunications + * (Zaawansowane przetwarzanie sygnaĹĂłw telekomunikacji cyfrowej) + * Ex. 2. task 1. + * - reading filter impulse response from file + * (script generating data file: ./matlab/design_task_1.m + * - poliphase interpolator L = 2 + * + * \author Marek Blok + * \date 2021.06.25 + */ +#include <DSP_lib.h> + +void Processing(void) +{ + DSP::LoadCoef coef_info; + int N_LPF; + DSP::Float_vector h_LPF; + + coef_info.Open("ex2_task1.coef", "matlab"); + N_LPF = coef_info.GetSize(0); + if (N_LPF < 1) + { + DSP::log << DSP::e::LogMode::Error << "No filter coeeficients: aborting" << endl; + return; + } + else + { + coef_info.Load(h_LPF); + } + /*************************************************************/ + + DSP::Clock_ptr MasterClock; + MasterClock=DSP::Clock::CreateMasterClock(); + + long int Fp1, Fp2; + + DSP::u::WaveInput AudioIn(MasterClock, "DSPElib.wav", "."); + Fp1 = AudioIn.GetSamplingRate(); + + int N_0, N_1; + DSP::Float_vector g0_LPF((N_LPF+1)/2), g1_LPF((N_LPF+1)/2); + + N_0 = 0; + for (int ind = 0; ind < N_LPF; ind+= 2) + { + g0_LPF[N_0] = h_LPF[ind]; + N_0++; + } + N_1 = 0; + for (int ind = 1; ind < N_LPF; ind+= 2) + { + g1_LPF[N_1] = h_LPF[ind]; + N_1++; + } + + + DSP::u::FIR InterpFIR_0(g0_LPF); + InterpFIR_0.SetName("0"); + DSP::u::FIR InterpFIR_1(g1_LPF); + InterpFIR_1.SetName("1"); + + Fp2 = 2*Fp1; + DSP::u::Zeroinserter Zeroinserter_0(MasterClock, 2U); + Zeroinserter_0.SetName("0"); + DSP::u::Zeroinserter Zeroinserter_1(MasterClock, 2U); + Zeroinserter_1.SetName("1"); + + + DSP::u::Delay Z_1(1); + Z_1.SetName("1"); + DSP::u::Addition Sum(2); + + // Output to the soundcard + DSP::u::AudioOutput SoundOut(Fp2, 1, 16); + // Output to the mono 16bit *.wav file + DSP::u::FileOutput FileOut("ex2_task1.wav", DSP::e::SampleType::ST_short, 1, DSP::e::FileType::FT_wav, Fp2); + + /*************************************************************/ + // Connections definitions + AudioIn.Output("out") >> InterpFIR_0.Input("in"); + InterpFIR_0.Output("out") >> Zeroinserter_0.Input("in"); + + AudioIn.Output("out") >> InterpFIR_1.Input("in"); + InterpFIR_1.Output("out") >> Zeroinserter_1.Input("in"); + Zeroinserter_1.Output("out") >> Z_1.Input("in"); + + Zeroinserter_0.Output("out") >> Sum.Input("in1"); + Z_1.Output("out") >> Sum.Input("in2"); + + Sum.Output("out") >> SoundOut.Input("in"); + Sum.Output("out") >> FileOut.Input("in"); + + + ///////////////////////////////// + // check if there are signals + // connected to all inputs + DSP::Component::CheckInputsOfAllComponents(); + + // *********************************** // + DSP::Clock::SchemeToDOTfile(MasterClock, "Ex2_task1.dot"); + + // *********************************** // + int SamplesInSegment = 512; + __int64 NoOfSamplesProcessed = 0; + // 10 seconds + #define MAX_SAMPLES_TO_PROCESS 10*Fp1 + while(NoOfSamplesProcessed < MAX_SAMPLES_TO_PROCESS) + { + + // ********************************************************** // + DSP::Clock::Execute(MasterClock, SamplesInSegment); + // ********************************************************** // + + if (AudioIn.GetBytesRead() > 0) + { + NoOfSamplesProcessed = 0; // Play the whole file + } + else // Play 200ms more + { + if (NoOfSamplesProcessed < MAX_SAMPLES_TO_PROCESS - Fp1/5) + NoOfSamplesProcessed = MAX_SAMPLES_TO_PROCESS - Fp1/5; + } + + NoOfSamplesProcessed += SamplesInSegment; + // ********************************************************** // + } + +} + + +int main(int argn, char *args[]) +{ + /*************************************************************/ + // Log file setup + DSP::log.SetLogFileName("log_file.txt"); + DSP::log.SetLogState(DSP::e::LogState::file | DSP::e::LogState::console); + + DSP::log << DSP::lib_version_string() << endl << endl; + /*************************************************************/ + + Processing(); + + /*************************************************************/ + DSP::Clock::FreeClocks(); + + return 0; +} diff --git a/Ex2/Makefile b/Ex2/Makefile new file mode 100644 index 0000000..c94c79f --- /dev/null +++ b/Ex2/Makefile @@ -0,0 +1,85 @@ +# Run: make Release +# Run: make Debug +CC=g++ +# comflag = -m32 +# comflag = -m64 +comflag = $(COMFLAG) + +DSPElib_DIR = ../../_DSPE_lib_minGW_/$(DSPElib_SUBDIR) + +SRC_DIR = . +SRC_CPP_SUBDIR = . + +#DFLAGS = -DWIN32 -DDEVCPP + +# -D INCLUDE_DSPE_EXAMPLES # TODO: uĹźycie w ramach kompilacji Main.cpp w trybie DEBUG +ifeq ($(MODE),Release) + CFLAGS = $(comflag) -std=c++0x -O3 -Wall -c -fmessage-length=0 -fno-strict-aliasing + LINKER_FLAGS = $(comflag) -s -static-libgcc -static-libstdc++ $(MISC_LINKER_FLAGS) + INCLUDES := -I"$(DSPElib_DIR)/include" -I"$(DSPElib_DIR)/include/rls" + DSPElib_FULLDIR = $(DSPElib_DIR)/rls + EXE_FILENAME = $(CPP_FILENAME)_rls.exe +else + CFLAGS = $(comflag) -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -W -Wshadow -Wconversion -fstrict-aliasing -fmax-errors=5 + LINKER_FLAGS = $(comflag) -static-libgcc -static-libstdc++ $(MISC_LINKER_FLAGS) + INCLUDES := -I"$(DSPElib_DIR)/include" -I"$(DSPElib_DIR)/include/dbg" + DSPElib_FULLDIR = $(DSPElib_DIR)/dbg + EXE_FILENAME = $(CPP_FILENAME)_dbg.exe +endif +# -U__STRICT_ANSI__ jest potrzebne do kompilacji debug_new.cpp, jezeli pominac ten plik to mozna rowniez wyrzucic te opcje +#CFLAGS_debug = $(comflag) -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -W -Wshadow -Wco#nversion -fstrict-aliasing -U__STRICT_ANSI__ + +SOURCES_NAMES = +SOURCES_NAMES += $(CPP_FILENAME).cpp +SOURCES = $(addprefix $(SRC_CPP_SUBDIR)/,$(SOURCES_NAMES)) + +SOURCES_DBG = +# SOURCES_DBG += $(SRC_DIR)/Main.cpp + +# ################################################# # +# DEBUG +OBJECTS := $(SOURCES:%.cpp=$(OUT_DIR)/%.o) +DEPENDS := $(SOURCES:%.cpp=$(OUT_DIR)/%.d) + +# ################################################# # +-include $(DEPENDS) + +all: build + + +# ########################################################################################### # +# ########################################################################################### # +build: $(SRC_DIR)/$(EXE_FILENAME) + +$(SRC_DIR)/$(EXE_FILENAME): $(OBJECTS) + @echo $(EXE_FILENAME) + $(CC) -L$(DSPElib_FULLDIR) $(OBJECTS) -o"$(SRC_DIR)/$(EXE_FILENAME)" $(LINKER_FLAGS) -lDSPE $(LIBS) + +# ########################################################################################### # +# ########################################################################################### # +# Z podanej listy usuwany $(OUT_DIR_WIN_RLS)/ oraz '.o' zamieniamy na '.cpp' +$(OBJECTS): $(OUT_DIR)/%.o : %.cpp + @echo $(@D) $< $@ + + #mkdir -p $(OUT_DIR)/$(SRC_CPP_SUBDIR) + mkdir -p $(@D) + $(CC) $(DFLAGS) $(CFLAGS) $(INCLUDES) -MMD $< -o $@ + + +clean: + @echo MODE: $(MODE) + + @if [ -d "$(OUT_DIR)" ]; then \ + echo "cleaning $(OUT_DIR_DBG) ..."; \ + #find $(OUT_DIR)/ -name "*.o" -type f -delete; \ + rm -rf $(OUT_DIR)/*.d; \ + rm -rf $(OUT_DIR)/*.o; \ + rm -rf $(OUT_DIR); \ + echo "cleaned $(OUT_DIR)"; \ + fi + rm -rf "$(SRC_DIR)/$(EXE_FILENAME)"; \ + #rm -rf "$(SRC_DIR)/*.gif"; \ + #rm -rf "$(SRC_DIR)/*.dot"; \ + +.PHONY: all build clean + diff --git a/Ex2/Makefile.main b/Ex2/Makefile.main new file mode 100644 index 0000000..cf6c368 --- /dev/null +++ b/Ex2/Makefile.main @@ -0,0 +1,60 @@ +# (View > Command Palette) => "Convert Indentation to Tabs" + +ifeq ($(VS_CFG),Windows-Debug) + MAKEFILE = "Makefile" + MODE = Debug + COMFLAG = -m64 + + OUT_DIR = ./out_win_dbg + DSPElib_SUBDIR = MinGW-W64_8.1.0 + MISC_LINKER_FLAGS = -static + LIBS = -lwinmm -lws2_32 + DFLAGS = -DWIN32 -DDEVCPP +endif +ifeq ($(VS_CFG),Windows-Release) + MAKEFILE = "Makefile" + MODE = Release + COMFLAG = -m64 + + OUT_DIR = ./out_win_rls + DSPElib_SUBDIR = MinGW-W64_8.1.0 + MISC_LINKER_FLAGS = -static + LIBS = -lwinmm -lws2_32 + DFLAGS = -DWIN32 -DDEVCPP +endif +ifeq ($(VS_CFG),Linux-Debug) + MAKEFILE = "Makefile" + MODE = Debug + COMFLAG = + + OUT_DIR = ./out_linux_dbg + DSPElib_SUBDIR = $(shell gcc -dumpmachine)-gcc_$(shell gcc -dumpversion) + MISC_LINKER_FLAGS = + LIBS := -lasound + DFLAGS = +endif +ifeq ($(VS_CFG),Linux-Release) + MAKEFILE = "Makefile" + MODE = Release + COMFLAG = + + OUT_DIR = ./out_linux_rls + DSPElib_SUBDIR = $(shell gcc -dumpmachine)-gcc_$(shell gcc -dumpversion) + MISC_LINKER_FLAGS = + LIBS := -lasound + DFLAGS = +endif + + + +build: + @echo "Building $(VS_CFG)" + @echo $(VS_CFG): $(MODE) // $(MAKEFILE) + make build CPP_FILENAME=$(FILE) MODE=$(MODE) COMFLAG=$(COMFLAG) DFLAGS="$(DFLAGS)" LIBS="$(LIBS)" OUT_DIR=$(OUT_DIR) DSPElib_SUBDIR=$(DSPElib_SUBDIR) MISC_LINKER_FLAGS="$(MISC_LINKER_FLAGS)" -f $(MAKEFILE) + +clean: + @echo "Cleaning $(VS_CFG)" + @echo $(VS_CFG): $(MODE) // $(MAKEFILE) + make clean MODE=$(MODE) OUT_DIR=$(OUT_DIR) -f $(MAKEFILE) + + diff --git a/Ex2/matlab/PERgraf.m b/Ex2/matlab/PERgraf.m new file mode 100644 index 0000000..a231ec9 --- /dev/null +++ b/Ex2/matlab/PERgraf.m @@ -0,0 +1,1565 @@ +function PERgraf(Akcja, param) + +global supress_msgbox + +% \fixed 2021.04.09 fileread replaced with audiofileread +% use addpath only when ont deployed +% added rmpath on Exit and DeleteFcn +% \fixed 2019.03.06 figure now uses IntegerHandle == 'off' so it does not +% conflict with other tools +% \fixed 2018.04.14 included readaudiofile (previously fileread) +% replaced boxcar with rectwin +% added selec_dir button +% \fixed 2018.03.02 pwelch: warning for L < M +% \fixed 2015.10.19 pwelch + detrend is now used instead of psd +% +% \fixed 2006.12.20 segment length for raw and modified periodographs is +% now automaticaly set based on signal length +% This spares us annoying warnings about L and M differences +% \added 2006.10.10 added 'lock' option to lock zoom scale +% \added 2006.10.09 added Fs, it can also be used in edit fields like 'x' in the same way like A +% \added 2006.10.09 added popupmenu with periodogrph type selection +% \fixed 2005.11.10 "delete" for last element resets it +% \fixed 2005.11.10 "new" now copies current setting instead off standard ones +% \Fixed 2005.11.10 dodano "supress_msgbox" +% \Fixed 2005.11.10 przy zmianie A wszystkie wykresy sš przerysowane +% \Fixed 2005.11.10 niewidoczny współczynnik 10^-x dla małych sygnałów +% \Fixed 2005.11.10 dodano akcję "actionA" +% - "A_edit" +% - "dA_edit" +% - "A_slider" +% - "minA_edit" +% - "maxA_edit" +% - "A_plus_radio" +% - "A_razy_radio" +% +% \Fixed 2005.11.02 nakładkowanie podawane w procentach !!! +% \Fixed 2005.11.02 detrender domylnie wyłšczony +% \Fixed 2005.11.02 Przełšczanie pomiędzy wzorcami nie uaktualnia N +% \Fixed 2005.11.02 message when error in entered data +% \Fixed 2005.11.02 wywietlany fragment sygnału o długoci ostanio +% wprowadzonego L, a nie najdłuższego z wszystkich sygnałów (added max_L) +% \Fixed 2005.11.02 Refresh Button +% \Fixed 2005.11.02 Use hourglass when busy +% \Fixed 2005.11.02 Mean, var should be updated acording to choose and use colour +% \Fixed 2005.11.02 Warning when M > K. +% +% +% Szacowanie długoci segmentu na podstawie liczby segmentów N, długoci cišgu L i wielkoci nakładkowania O: M = L/(N-O*(N-1)) +if nargin == 0 % LAUNCH GUI + +% fig = openfig(mfilename,'reuse'); return; %ZapiszFig(1,'PerGUI.m') + if isempty(findobj(0, 'tag', 'perGUI')) +% set(0, 'DefaultFigureVisible', 'off'); + fig = perGUI; + set(fig, 'IntegerHandle','off'); +% set(0, 'DefaultFigureVisible', 'on'); + set(fig,'tag', 'perGUI', 'Visible', 'on', 'Units', 'pixels', 'DeleteFcn', 'PERgraf(''Exit'')'); + %set(fig,'NumberTitle', 'off', 'Name',['Periodogramowe estymatory widma gęstoci mocy ver. 1.4 (dr inż. Marek Blok 16.04.2018) ', pwd]) + UpdateFigTitle(); + + PERgraf('Init'); + PERgraf('signal'); +% PERgraf('per'); + else + PERgraf('Exit'); + end + return; +end; + +if ~isstr(Akcja) % INVOKE NAMED SUBFUNCTION OR CALLBACK + disp('Something''s wrong'); + return; +end; + +% Generate a structure of handles to pass to callbacks, and store it. +fig=findobj(0, 'tag', 'perGUI'); +hEditN=findobj(fig,'tag', 'N_edit'); +hEditM=findobj(fig,'tag', 'M_edit'); +hEditL=findobj(fig,'tag', 'L_edit'); +hEditK=findobj(fig,'tag', 'K_edit'); +hEditO=findobj(fig,'tag', 'O_edit'); +hEditW=findobj(fig,'tag', 'w_edit'); +hEditX=findobj(fig,'tag', 'x_edit'); +h_real=findobj(fig,'tag', 'real_checkbox'); +h_dB=findobj(fig,'tag', 'dB_checkbox'); +h_rgb(1)=findobj(fig,'tag', 'r_checkbox'); +h_rgb(2)=findobj(fig,'tag', 'g_checkbox'); +h_rgb(3)=findobj(fig,'tag', 'b_checkbox'); +hEditNoise=findobj(fig,'tag', 'Noise_edit'); +hEditName=findobj(fig,'tag', 'Name_edit'); +hMenu=findobj(fig,'tag', 'choose_popupmenu'); +h_det=findobj(fig,'tag', 'detrend_checkbox'); +ha=get(fig, 'UserData'); +Ktory=get(hMenu,'Value'); +hEdit_dY=findobj(fig,'tag', 'dY_edit'); +hParam=findobj(fig,'tag', 'text20'); +% \fixed 2005.11.10 +hA.A_edit=findobj(fig,'tag', 'A_edit'); +hA.dA_edit=findobj(fig,'tag', 'dA_edit'); +hA.A_slider=findobj(fig,'tag', 'A_slider'); +hA.minA_edit=findobj(fig,'tag', 'minA_edit'); +hA.maxA_edit=findobj(fig,'tag', 'maxA_edit'); +hA.A_plus_radio=findobj(fig,'tag', 'A_plus_radio'); +hA.A_razy_radio=findobj(fig,'tag', 'A_razy_radio'); +% /fixed 2005.11.10 +% \added 2006.10.09 +h_per_type=findobj(fig,'tag', 'per_type_popupmenu'); +h_Fs=findobj(fig,'tag', 'Fs_edit'); +h_lock=findobj(fig,'tag', 'lock_checkbox'); +% /added 2006.10.09 + + +if strcmp(Akcja, 'Exit') + if (~isdeployed) + path2rm = getappdata(fig, 'pwd'); + rmpath(path2rm); + end + close(fig); + disp('Closed PERgraf'); + return; + +elseif strcmp(Akcja, 'select_dir') + dir = uigetdir(); + if ischar(dir), + cd(dir); + UpdateFigTitle(); + end + return; + +elseif strcmp(Akcja, 'Init') + % UserData przechowuje wartoci domylne + supress_msgbox = 0; + + if (~isdeployed) + setappdata(fig, 'pwd', pwd); + addpath(pwd,'-end'); + end + + set(hEditX,'UserData','randn(1,L)'); + set(hEditX,'String','randn(1,L)'); + set(hEditX,'Max', 2); + + set(hEditW,'UserData','rectwin(M)'); + set(hEditW,'String','rectwin(M)'); + + set(hEditL,'UserData','100'); + set(hEditL,'String','100'); + set(hEditM,'UserData','100'); + set(hEditM,'String','100'); + set(hEditNoise,'UserData','-600'); + set(hEditNoise,'String','-600'); + +% set(hEditN,'UserData','1'); +% set(hEditN,'String','1'); + set(hEditO,'UserData','0'); + set(hEditO,'String','0'); + + set(hEditK,'UserData','1024'); + set(hEditK,'String','1024'); + + set(hEditName,'String','new'); + set(hMenu,'String','new'); + + set(h_real,'UserData',1); + set(h_real,'Value',1); + + set(h_dB,'UserData',0); + set(h_dB,'Value',0); + + set(h_det,'UserData',0); % \Fixed 2005.11.02 - detrender domylnie wyłšczony + set(h_det,'Value',0); + + pom(1,1:3)=[0 0 0]; + for ind=1:3, + set(h_rgb(ind),'Value', pom(1,ind)); + end; + set(h_rgb(1),'UserData',pom); + + ha(1)=findobj(fig,'tag', 'Signal_re_axes'); + ha(2)=findobj(fig,'tag', 'Signal_im_axes'); + ha(3)=findobj(fig,'tag', 'per_axes'); + set(fig, 'UserData', ha, 'Units', 'Pixel'); + + set(hMenu,'UserData', [NaN, NaN, NaN, 1, -100, 5, 1, 0, 0]); %handles & maximal values + + set(hEdit_dY,'String','120'); + + % \fixed 2005.11.10 + A.A = 1.0; A.dA = 0.1; + A.min=0.0; A.max=2.0; + A.is_plus=1; + set(hA.A_edit, 'UserData', A); + % UpdateA(hA); + set(hA.A_edit, 'String', A.A); + set(hA.dA_edit, 'String', A.dA); + set(hA.minA_edit, 'String', A.min); + set(hA.maxA_edit, 'String', A.max); + set(hA.A_plus_radio, 'Value', A.is_plus); + set(hA.A_razy_radio, 'Value', 1-A.is_plus); + set(hA.A_slider, 'min', A.min, 'max', A.max, 'value', A.A); + % /fixed 2005.11.10 + % \added 2006.10.09 + set(h_per_type, 'UserData', 1); % surowy periodograf jako domylny + set(h_Fs, 'UserData', 'Inf'); + set(h_Fs, 'String', 'Inf'); + % \added 2006.10.09 + + UpdatePergraphGUI(1, fig); + return; + +elseif strcmp(Akcja, 'change_name') + pom=get(hMenu,'String'); + pom2=get(hEditName,'String'); + pom(Ktory,1:length(pom2)+1)=[pom2 0]; + set(hMenu,'String',pom); + set(hMenu, 'Value', Ktory); + return; + +elseif strcmp(Akcja, 'Fs_changed') + tekst=[get(h_Fs, 'String') 0]; + pom=get(h_Fs,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(h_Fs,'UserData', setstr(pom)); + + tekstX=get(hEditX,'UserData'); tekstX=tekstX(Ktory,:); + ind=find(tekstX==0); + if ~isempty(ind) + tekstX=tekstX(1:ind(1)-1); + end; + if ~isempty(findstr(tekstX, 'Fs')) + PERgraf('signal', Ktory); + end + PERgraf('per', Ktory); + +elseif strcmp(Akcja, 'new') + old_Ktory=get(hMenu,'Value'); + + pom=get(hMenu,'String'); + Ktory=size(pom,1)+1; + pom(Ktory,1:4)=['new' 0]; + set(hMenu,'String',pom); + + + pom=get(hEditX,'UserData'); +% pom(Ktory,1:11)=['randn(1,L)' 0]; + pom(Ktory,:)=pom(old_Ktory,:); + set(hEditX,'UserData',pom); + pom=get(hEditW,'UserData'); +% pom(Ktory,1:10)=['rectwin(M)' 0]; + pom(Ktory,:)=pom(old_Ktory,:); + set(hEditW,'UserData',pom); + + pom=get(hEditL,'UserData'); +% pom(Ktory,1:4)=['100' 0]; + pom(Ktory,:)=pom(old_Ktory,:); + set(hEditL,'UserData',pom); + pom=get(hEditM,'UserData'); +% pom(Ktory,1:4)=['100' 0]; + pom(Ktory,:)=pom(old_Ktory,:); + set(hEditM,'UserData',pom); + pom=get(hEditNoise,'UserData'); +% pom(Ktory,1:5)=['-100' 0]; + pom(Ktory,:)=pom(old_Ktory,:); + set(hEditNoise,'UserData',pom); + +% pom=get(hEditN,'UserData'); +% pom(Ktory,1:2)=['1' 0]; +% set(hEditN,'UserData',pom); + pom=get(hEditO,'UserData'); +% pom(Ktory,1:2)=['0' 0]; + pom(Ktory,:)=pom(old_Ktory,:); + set(hEditO,'UserData',pom); + + pom=get(hEditK,'UserData'); +% pom(Ktory,1:5)=['1024' 0]; + pom(Ktory,:)=pom(old_Ktory,:); + set(hEditK,'UserData',pom); + + pom=get(hMenu,'UserData'); + pom(Ktory,1:size(pom,2))=ones(1,size(pom,2))*NaN; + set(hMenu,'UserData',pom); + + pom=get(h_real,'UserData'); +% pom(Ktory,1)=1; + pom(Ktory,:)=pom(old_Ktory,:); + set(h_real,'Value', pom(Ktory,1)); + set(h_real,'UserData',pom); + + pom=get(h_det,'UserData'); +% pom(Ktory,1)=0; % \Fixed 2005.11.02 + pom(Ktory,:)=pom(old_Ktory,:); + set(h_det,'Value', pom(Ktory,1)); + set(h_det,'UserData',pom); + + pom=get(h_rgb(1),'UserData'); + pom(Ktory,1:3)=[0 0 0]; + for ind=1:3, + set(h_rgb(ind),'Value', pom(Ktory,ind)); + end; + set(h_rgb(1),'UserData',pom); + + set(hMenu,'Value', Ktory); + + % \added 2006.10.09 + pom = get(h_per_type, 'UserData'); + pom(Ktory,:)=pom(old_Ktory,:); + set(h_per_type,'Value', pom(Ktory,1)); + set(h_per_type,'UserData',pom); + pom = get(h_Fs, 'UserData'); + pom(Ktory,:)=pom(old_Ktory,:); + set(h_Fs,'String', pom(Ktory,:)); + set(h_Fs,'UserData',pom); + % /added 2006.10.09 + + PERgraf('Choose'); + PERgraf('signal', Ktory); + return; + +elseif strcmp(Akcja, 'Reset') + Ktory=get(hMenu,'Value'); + + pom=get(hMenu,'String'); + pom(Ktory,1:4)=['new' 0]; + set(hMenu,'String',pom); + + + pom=get(hEditX,'UserData'); + pom(Ktory,1:11)=['randn(1,L)' 0]; + set(hEditX,'UserData',pom); + pom=get(hEditW,'UserData'); + pom(Ktory,1:10)=['rectwin(M)' 0]; + set(hEditW,'UserData',pom); + + pom=get(hEditL,'UserData'); + pom(Ktory,1:4)=['100' 0]; + set(hEditL,'UserData',pom); + pom=get(hEditM,'UserData'); + pom(Ktory,1:4)=['100' 0]; + set(hEditM,'UserData',pom); + pom=get(hEditNoise,'UserData'); + pom(Ktory,1:5)=['-600' 0]; + set(hEditNoise,'UserData',pom); + +% pom=get(hEditN,'UserData'); +% pom(Ktory,1:2)=['1' 0]; +% set(hEditN,'UserData',pom); + pom=get(hEditO,'UserData'); + pom(Ktory,1:2)=['0' 0]; + set(hEditO,'UserData',pom); + + pom=get(hEditK,'UserData'); + pom(Ktory,1:5)=['1024' 0]; + set(hEditK,'UserData',pom); + + pom=get(hMenu,'UserData'); + for ind=1:3, + if isfinite(pom(Ktory,ind)) + delete(pom(Ktory,ind)); + end + end +% pom(Ktory,:)=[]; + pom(Ktory,1:size(pom,2))=ones(1,size(pom,2))*NaN; + set(hMenu,'UserData',pom); + + pom=get(h_real,'UserData'); + pom(Ktory,1)=1; + set(h_real,'Value', pom(Ktory,1)); + set(h_real,'UserData',pom); + + pom=get(h_det,'UserData'); + pom(Ktory,1)=0; % \Fixed 2005.11.02 + set(h_det,'Value', pom(Ktory,1)); + set(h_det,'UserData',pom); + + pom=get(h_rgb(1),'UserData'); + pom(Ktory,1:3)=[0 0 0]; + for ind=1:3, + set(h_rgb(ind),'Value', pom(Ktory,ind)); + end; + set(h_rgb(1),'UserData',pom); + + set(hMenu,'Value', Ktory); + + % \added 2006.10.09 + pom = get(h_per_type, 'UserData'); + pom(Ktory,1)=1; + set(h_per_type,'Value', pom(Ktory,1)); + set(h_per_type,'UserData',pom); + pom = get(h_Fs, 'UserData'); + pom(Ktory,1:4)=['Inf', 0]; + set(h_Fs,'String', pom(Ktory,:)); + set(h_Fs,'UserData',pom); + % /added 2006.10.09 + + PERgraf('Choose'); + PERgraf('signal', Ktory); + return; + +elseif strcmp(Akcja, 'delete') + pom=get(hMenu,'String'); + if size(pom,1)==1, + PERgraf('Reset'); + return; + end; + pom(Ktory,:)=[]; + set(hMenu,'String',pom); + + + pom=get(hEditX,'UserData'); + pom(Ktory,:)=[]; + set(hEditX,'UserData',pom); + pom=get(hEditW,'UserData'); + pom(Ktory,:)=[]; + set(hEditW,'UserData',pom); + + pom=get(hEditL,'UserData'); + pom(Ktory,:)=[]; + set(hEditL,'UserData',pom); + pom=get(hEditM,'UserData'); + pom(Ktory,:)=[]; + set(hEditM,'UserData',pom); + pom=get(hEditNoise,'UserData'); + pom(Ktory,:)=[]; + set(hEditNoise,'UserData',pom); + +% pom=get(hEditN,'UserData'); +% pom(Ktory,:)=[]; +% set(hEditN,'UserData',pom); + pom=get(hEditO,'UserData'); + pom(Ktory,:)=[]; + set(hEditO,'UserData',pom); + + pom=get(hEditK,'UserData'); + pom(Ktory,:)=[]; + set(hEditK,'UserData',pom); + + pom=get(hMenu,'UserData'); + for ind=1:3, + if isfinite(pom(Ktory,ind)) + delete(pom(Ktory,ind)); + end + end + pom(Ktory,:)=[]; + set(hMenu,'UserData',pom); + + pom=get(h_real,'UserData'); + pom(Ktory,:)=[]; + set(h_real,'UserData',pom); + + pom=get(h_det,'UserData'); + pom(Ktory,:)=[]; + set(h_det,'UserData',pom); + + pom=get(h_rgb(1),'UserData'); + pom(Ktory,:)=[]; + set(h_rgb(1),'UserData',pom); + set(hMenu,'Value', 1); + + % \added 2006.10.09 + pom = get(h_per_type, 'UserData'); + pom(Ktory,:)=[]; + set(h_per_type,'UserData',pom); + pom = get(h_Fs, 'UserData'); + pom(Ktory,:)=[]; + set(h_Fs,'UserData',pom); + % /added 2006.10.09 + + PERgraf('Choose'); + PERgraf('signal', 1); % \Fixed 2005.11.02 + return; + +% Changing previously entered data set +elseif strcmp(Akcja, 'Choose') + %selected new filter response + pom=get(hMenu,'String'); + ind=find(pom(Ktory,:)==0); + if isempty(ind) + ind=size(pom,2); + else + ind=ind(1)-1; + end + set(hEditName,'String',pom(Ktory,1:ind)); + + pom=get(hEditX,'UserData'); + set(hEditX, 'String', pom(Ktory,:)); + pom=get(hEditW,'UserData'); + set(hEditW, 'String', pom(Ktory,:)); + + pom=get(hEditL,'UserData'); + set(hEditL, 'String', pom(Ktory,:)); +% tmp_=['L=' pom(Ktory,:) ';'] +% eval(tmp_, 'L=0;'); % \Fixed 2005.11.02 + L=eval(pom(Ktory,:), '0'); % \Fixed 2005.11.02 + + pom=get(hEditM,'UserData'); + set(hEditM, 'String', pom(Ktory,:)); +% eval(['M=' pom(Ktory,:) ';'], 'M=0;'); % \Fixed 2005.11.02 + M=eval(pom(Ktory,:), '0'); % \Fixed 2005.11.02 + + pom=get(hEditNoise,'UserData'); + set(hEditNoise, 'String', pom(Ktory,:)); + + pom=get(hEditO,'UserData'); + set(hEditO, 'String', pom(Ktory,:)); +% eval(['O=' pom(Ktory,:) ';'], 'O=0;'); % \Fixed 2005.11.02 + O=eval(pom(Ktory,:), '0'); % \Fixed 2005.11.02 + O=round(O/100*M); % \Fixed 2005.11.03 nakładkowanie podawane w procentach !!! + +% pom=get(hEditN,'UserData'); +% set(hEditN, 'String', pom(Ktory,:)); + N = fix((L-O)/(M-O)); % \Fixed 2005.11.02 Updates N when user data set is changed + set(hEditN, 'String', sprintf('%i', N)); + + + pom=get(hEditK,'UserData'); + set(hEditK, 'String', pom(Ktory,:)); + + pom=get(h_real,'UserData'); + set(h_real,'Value', pom(Ktory,1)); + + pom=get(h_det,'UserData'); + set(h_det,'Value', pom(Ktory,1)); + + pom=get(h_rgb(1),'UserData'); + for ind=1:3, + set(h_rgb(ind),'Value', sign(pom(Ktory,ind))); + end; + + % \added 2006.10.09 + pom = get(h_per_type, 'UserData'); + per_type = pom(Ktory,1); + set(h_per_type,'Value', pom(Ktory,1)); + pom = get(h_Fs, 'UserData'); + set(h_Fs,'String', pom(Ktory,:)); + % /added 2006.10.09 + + % \Fixed 2005.11.02 + pom=get(hMenu,'UserData'); + psd_mean = pom(:,8); % \Fixed 2005.11.02 + psd_var = pom(:,9); % \Fixed 2005.11.02 + set(hParam,'string',sprintf('mean=%f\r\nvar =%f',psd_mean(Ktory),psd_var(Ktory))); + pom=get(h_rgb(1),'UserData'); + kolor=pom(Ktory,:); + set(hParam, 'ForegroundColor', kolor); % \Fixed 2005.11.02 + % /Fixed 2005.11.02 + +% PERgraf('signal', Ktory); + UpdatePergraphGUI(per_type, fig); + return; + +elseif strcmp(Akcja, 'signal') + set(fig, 'Pointer', 'watch'); % \Fixed 2005.11.02 + if nargin==2, + Ktory=param; + else + %save strings + tekst=[get(hEditL, 'String') 0]; + pom=get(hEditL,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditL,'UserData', setstr(pom)); + + tekst=[get(hEditNoise, 'String') 0]; + pom=get(hEditNoise,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditNoise,'UserData', setstr(pom)); + + tekst=get(hEditX, 'String').'; + tekst=[tekst(:); 0].'; + pom=get(hEditX,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditX,'UserData', setstr(pom)); + + tekst=get(h_real, 'Value'); + pom=get(h_real,'UserData'); + pom(Ktory,1)=tekst; + set(h_real,'UserData', pom); + end; + + pom=get(hMenu,'UserData'); + hp_re=pom(:,1); + hp_im=pom(:,2); + hp_per=pom(:,3); + max_x=pom(:,4); + min_per=pom(:,5); + max_per=pom(:,6); + max_L = pom(:,7); % \Fixed 2005.11.02 + psd_mean = pom(:,8); % \Fixed 2005.11.02 + psd_var = pom(:,9); % \Fixed 2005.11.02 + + + %generate signal + tekstL=get(hEditL,'UserData'); tekstL=tekstL(Ktory,:); + ind=find(tekstL==0); + if ~isempty(ind) + tekstL=tekstL(1:ind(1)-1); + end; +% eval(['L=' tekstL ';'], 'L=1;') + L = round(getVal(tekstL, 1, hA, 'Error in parameter L')); % \Fixed 2005.11.02 + if L < 1, + L = 1; + end + max_L(Ktory) = L; % \Fixed 2005.11.02 + + A = get(hA.A_edit, 'UserData'); + A = A.A; + + % \added 2006.10.09 + tekst_Fs=get(h_Fs,'UserData'); tekst_Fs=tekst_Fs(Ktory,:); + ind=find(tekst_Fs==0); + if ~isempty(ind) + tekst_Fs=tekst_Fs(1:ind(1)-1); + end; + Fs = getVal(tekst_Fs, Inf, hA, ['sampling rate error: >>' tekst_Fs '<<']); + % /added 2006.10.09 + + n=0:L-1; + tekstX=get(hEditX,'UserData'); tekstX=tekstX(Ktory,:); + ind=find(tekstX==0); + if ~isempty(ind) + tekstX=tekstX(1:ind(1)-1); + end; +% eval(['x=' tekstX ';'], ['disp(''signal string error: >>' tekstX '<<''); x=zeros(1,L);']) + % \Fixed 2005.11.02 + err_ = 0; + eval(['x=' tekstX ';'], ['err_=1; x=zeros(1,L);']) + if err_==1, + tmp_ = getVal('NaN', 0, hA, ['signal string error: >>' tekstX '<<']); + end + % /Fixed 2005.11.02 + + Re=get(h_real,'UserData'); Re=Re(Ktory,1); + + tekstNoise=get(hEditNoise,'UserData'); tekstNoise=tekstNoise(Ktory,:); + ind=find(tekstNoise==0); + if ~isempty(ind) + tekstNoise=tekstNoise(1:ind(1)-1); + end; +% eval(['Noise=' tekstNoise ';'], 'Noise=-300;') + Noise = getVal(tekstNoise, -300, hA, 'Error in parameter Noise'); % \Fixed 2005.11.02 + + x=x(:); + if length(x)<L; + x(L)=0; + else + x=x(1:L); + end; + + N_lin=10.^(Noise/20); + if Re==1 + x=real(x)+N_lin*randn(size(x)); + else + x=x+(N_lin*randn(size(x))+N_lin*j*randn(size(x)))/sqrt(2); + end; + max_x(Ktory)=max(abs([real(x); imag(x)])); + + %draw signal + pom=get(h_rgb(1),'UserData'); + kolor=pom(Ktory,:); + + %real part of the signal + axes(ha(1)); + if isnan(hp_re(Ktory)) + hold on; + hp_re(Ktory)=plot(n,real(x), 'Color', kolor); + hold off; + else + set(hp_re(Ktory),'Xdata', n, 'Ydata', real(x), 'Color', kolor); + end + set(ha(1), 'Xlim', [-0.5, max(max_L)-0.5], 'Ylim', [-1.1 1.1]*max(max_x)); % \Fixed 2005.11.02 + eval('rmappdata(get(ha(1),''Zlabel''),''ZOOMAxesData'')','set(get(ha(1),''ZLabel''),''UserData'',[])'); +% eval('zoom reset', 'set(get(ha(1),''ZLabel''),''UserData'',[]);'); +% reset(get(ha(1),'ZLabel')); + + %imaginary part of the signal + axes(ha(2)); + if isnan(hp_im(Ktory)) + hold on; + hp_im(Ktory)=plot(n,imag(x), 'Color', kolor); + hold off; + else + set(hp_im(Ktory),'Xdata', n, 'Ydata', imag(x), 'Color', kolor); + end + set(ha(2), 'Xlim', [-0.5, max(max_L)-0.5], 'Ylim', [-1.1 1.1]*max(max_x)); % \Fixed 2005.11.02 +% set(get(ha(2),'ZLabel'),'UserData',[]); +% reset(get(ha(2),'ZLabel')); + eval('rmappdata(get(ha(2),''Zlabel''),''ZOOMAxesData'')','set(get(ha(2),''ZLabel''),''UserData'',[])'); +% eval('zoom reset', 'set(get(ha(2),''ZLabel''),''UserData'',[]);'); + + + set(hMenu,'UserData', [hp_re, hp_im, hp_per, max_x, min_per, max_per, max_L, psd_mean, psd_var]); % \Fixed 2005.11.02 + + set(fig, 'Pointer', 'arrow'); % \Fixed 2005.11.02 + + %compute and draw periodogram + PERgraf('per', Ktory) + return; + +elseif strcmp(Akcja, 'per_type_change') + per_type = get(h_per_type, 'Value'); + pom = get(h_per_type, 'UserData'); + pom(Ktory,1)=per_type; + set(h_per_type,'UserData',pom); + + UpdatePergraphGUI(per_type, fig); + %compute and draw periodogram + PERgraf('per', Ktory) + +elseif strcmp(Akcja, 'per') + set(fig, 'Pointer', 'watch'); % \Fixed 2005.11.02 + if nargin==2, + Ktory=param; + else + %save strings + tekst=[get(hEditK, 'String') 0]; + pom=get(hEditK,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditK,'UserData', setstr(pom)); + + tekst=[get(hEditM, 'String') 0]; + pom=get(hEditM,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditM,'UserData', setstr(pom)); + +% tekst=[get(hEditN, 'String') 0]; +% pom=get(hEditN,'UserData'); +% pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... +% zeros(1, max([1; size(pom,2); length(tekst)])); +% pom(Ktory,1:length(tekst))=tekst; +% set(hEditN,'UserData', setstr(pom)); + + tekst=[get(hEditO, 'String') 0]; + pom=get(hEditO,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditO,'UserData', setstr(pom)); + + tekst=[get(hEditW, 'String') 0]; + pom=get(hEditW,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditW,'UserData', setstr(pom)); + + tekst=get(h_det, 'Value'); + pom=get(h_det,'UserData'); + pom(Ktory,1)=tekst; + set(h_det,'UserData', pom); + end; + + pom=get(hMenu,'UserData'); + hp_re=pom(:,1); + hp_im=pom(:,2); + hp_per=pom(:,3); + max_x=pom(:,4); + min_per=pom(:,5); + max_per=pom(:,6); + max_L = pom(:,7); % \Fixed 2005.11.02 + psd_mean = pom(:,8); % \Fixed 2005.11.02 + psd_var = pom(:,9); % \Fixed 2005.11.02 + + per_type = get(h_per_type,'UserData'); per_type=per_type(Ktory,1); + + %DFT length + tekstK=get(hEditK,'UserData'); tekstK=tekstK(Ktory,:); + ind=find(tekstK==0); + if ~isempty(ind) + tekstK=tekstK(1:ind(1)-1); + end; +% eval(['K=' tekstK ';'], 'K=16;') + K = getVal(tekstK, 16, hA, 'Error in parameter K'); % \Fixed 2005.11.02 + +%%%%%%%%%%%%%%%%%%%%% +% \fixed 2006.12.20 +%%%%%%%%%%%%%%%%%%%%% + % signal * BEGIN * + x=get(hp_re(Ktory), 'Ydata')+j*get(hp_im(Ktory), 'Ydata'); + % signal * END * + + if (per_type == 1) | (per_type == 2) + M = length(x); + %if (length(x) ~= M) + % tmp_ = getVal('NaN', 0, hA, ['signal length is different from periodograph segment length (L != M)']); + %end + %if length(x) < M, + % x(M) = 0; + %else + % x = x(1:M); + %end; + + + if (M>K) + if supress_msgbox ==1, + warning('L cannot be larger than K'); + else + uiwait(msgbox('L cannot be larger than K', 'modal')); + end + M=K; + x = x(1:M); + end; + + else + + tekstM=get(hEditM,'UserData'); tekstM=tekstM(Ktory,:); + ind=find(tekstM==0); + if ~isempty(ind) + tekstM=tekstM(1:ind(1)-1); + end; + % eval(['M=' tekstM ';'], 'M=16;') + M = round(getVal(tekstM, 16, hA, 'Error in parameter M')); % \Fixed 2005.11.02 + if M < 1, + M = 1; + end + + if (M>K) + if supress_msgbox ==1, + warning('M cannot be larger than K'); + else + uiwait(msgbox('M cannot be larger than K', 'modal')); + end + M=K; + end; + end +%%%%%%%%%%%%%%%%%%%%% +% /fixed 2006.12.20 +%%%%%%%%%%%%%%%%%%%%% + +% tekstN=get(hEditN,'UserData'); tekstN=tekstN(Ktory,:); +% ind=find(tekstN==0); +% if ~isempty(ind) +% tekstN=tekstN(1:ind(1)-1); +% end; +% eval(['N=' tekstN ';'], 'N=16;') + + if per_type == 4, + tekstO=get(hEditO,'UserData'); tekstO=tekstO(Ktory,:); + ind=find(tekstO==0); + if ~isempty(ind) + tekstO=tekstO(1:ind(1)-1); + end; + % eval(['O=' tekstO ';'], 'O=0;') + O = getVal(tekstO, 0, hA, 'Error in parameter O'); % \Fixed 2005.11.02 + O = round(O/100*M); % \Fixed 2005.11.02 nakładkowanie podawane w procentach !!! + else + O = 0; % no overlapping + end + + if per_type ~= 1, + tekstW=get(hEditW,'UserData'); tekstW=tekstW(Ktory,:); + ind=find(tekstW==0); + if ~isempty(ind) + tekstW=tekstW(1:ind(1)-1); + end; + + % \Fixed 2005.11.02 + A = get(hA.A_edit, 'UserData'); + A = A.A; + + err_ = 0; + eval(['w=' tekstW ';'], 'err_=1; w=ones(1,M);') + if err_==1, + tmp_ = getVal('NaN', 0, hA, ['window string error: >>' tekstW '<<']); + end + % /Fixed 2005.11.02 + else + w = ones(1,M); + end + + w=w(:); + if length(w)<M; + w(M)=0; + else + w=w(1:M); + end; + + N = fix((length(x)-O)/(M-O)); + set(hEditN, 'String', sprintf('%i', N)); + + det_=get(h_det,'UserData'); det_=det_(Ktory,1); + if det_==0, + det_='none'; + else + det_='linear'; + end; + + Fs = get(h_Fs, 'UserData'); Fs = Fs(Ktory, :); + Fs = getVal(Fs, Inf, hA, 'Error in parameter Fs'); + if ~isfinite(Fs), + Fs = 1; + end + %[Per, f]=psd(x, K, Fs, w, O, det_); + + if strcmp(det_, 'none') ~= 1, + w_tmp = w(:); + N_tmp = length(x); % Number of data points + N_wind = length(w); % length of window + % zero-pad x if it has length less than the window length: + if N_tmp < N_wind + x(N_wind)=0; + N_tmp = N_wind; + end + % Number of windows (k = fix(n/nwind) for noverlap=0): + k_tmp = fix((N_tmp-O)/(N_wind-O)); + % Zero-pad to allow x to have equal number of elements as k window elements. + if N_tmp < N_wind*k_tmp, + x(N_wind*k_tmp)=0; + end + xr_tmp=reshape(x,N_wind,k_tmp) % Resizes X column-wise to nwind + xr_tmp=detrend(xr_tmp); % DETRENDS each column, aka segment + x=reshape(xr_tmp,length(x),1) % Makes x back into a column vector + end + % Korekta 2018.03.02 + if length(x) < length(w) + x(length(w)) = 0; + if supress_msgbox ==1, + warning('L should not be smaller than M'); + else + uiwait(msgbox('L should not be smaller than M', 'modal')); + end + end + [Per, f]=pwelch(x, w, O, K, Fs); + + Re=get(h_real,'UserData'); + if ~Re(Ktory,1) + f=fftshift(f); + f(1:floor(K/2))=f(1:floor(K/2))-Fs; % \fixed 2006.10.10 + Per=fftshift(Per); + else + f=[-f(length(f):-1:1); f]; + Per=[Per(length(Per):-1:1); Per]; + end + psd_mean(Ktory)=mean(Per); + psd_var(Ktory)=std(Per).^2; + set(hParam,'string',sprintf('mean=%f\r\nvar =%f',psd_mean(Ktory),psd_var(Ktory))); + + min_per(Ktory)=min([Per(isfinite(Per)); 0]); + max_per(Ktory)=max([Per(isfinite(Per)); 0.001]); + if get(h_dB, 'UserData') %dB + Per=10*log10(Per); + end + + %draw signal + pom=get(h_rgb(1),'UserData'); + kolor=pom(Ktory,:); + set(hParam, 'ForegroundColor', kolor); % \Fixed 2005.11.02 + + %periodogram + axes(ha(3)); + if isnan(hp_per(Ktory)) + hold on; + hp_per(Ktory)=plot(f,Per, 'Color', kolor); + hold off; + else + set(hp_per(Ktory),'Xdata', f, 'Ydata', Per, 'Color', kolor); + end + max_Fs = getMaxFs(h_Fs, hA); + if all(Re) + set(ha(3), 'Xlim', [0 max_Fs/2]); + else + set(ha(3), 'Xlim', [-max_Fs/2 max_Fs/2]); + end +% set(get(ha(3),'ZLabel'),'UserData',[]); +% reset(get(ha(3),'ZLabel')); + eval('rmappdata(get(ha(3),''Zlabel''),''ZOOMAxesData'')','set(get(ha(3),''ZLabel''),''UserData'',[])'); +% eval('zoom reset', 'set(get(ha(3),''ZLabel''),''UserData'',[]);'); + + set(hMenu,'UserData', [hp_re, hp_im, hp_per, max_x, min_per, max_per, max_L, psd_mean, psd_var]); % \Fixed 2005.11.02 + + PERgraf('per_ylim'); + zoom on; + set(fig, 'Pointer', 'arrow'); % \Fixed 2005.11.02 + return; + +elseif strcmp(Akcja, 'Color') + pom=get(h_rgb(1),'UserData'); + for ind=1:3, + pom(Ktory,ind)=get(h_rgb(ind),'Value')*0.75; + end; + set(h_rgb(1),'UserData', pom); + + pom2=get(hMenu,'UserData'); + hp_re=pom2(:,1); + hp_im=pom2(:,2); + hp_per=pom2(:,3); + + %PERgraf('redraw', Ktory); %w zasadzie tutaj tylko zmiana koloru bez przeliczania + set([hp_re(Ktory), hp_im(Ktory), hp_per(Ktory)], 'Color', pom(Ktory,:)); + set(hParam, 'ForegroundColor', pom(Ktory,:)); % \Fixed 2005.11.02 + return; + +elseif strcmp(Akcja, 'lock') + lock = get(h_lock, 'Value'); + if (lock == 1) + pom = [get(ha(3), 'Xlim'), get(ha(3), 'Ylim')]; + set(h_lock, 'UserData', pom); + end + PERgraf('per_ylim'); + +elseif strcmp(Akcja, 'dB') + pom=get(h_dB, 'UserData'); + if pom~=get(h_dB, 'Value') + pom=get(hMenu,'UserData'); + hp_per=pom(:,3); + for ind=1:length(hp_per) + sygn=get(hp_per(ind),'Ydata'); + if get(h_dB, 'Value') %dB + sygn=10*log10(sygn); + else %lin + sygn=10.^(sygn/10); + end; + set(hp_per(ind),'Ydata', sygn); + end; + set(h_dB, 'UserData', get(h_dB, 'Value')); + + lock = get(h_lock, 'Value'); + if (lock == 1) + pom= get(h_lock, 'UserData'); + if get(h_dB, 'Value') %dB + pom(3:4) = 10*log10(pom(3:4)); + if ~isfinite(pom(3)), + pom(3) = -300; + end + else %lin + pom(3:4) = 10.^(pom(3:4)/10); + end; + set(h_lock, 'UserData', pom); + end + end + PERgraf('per_ylim'); + return + +elseif strcmp(Akcja, 'per_ylim') + lock = get(h_lock, 'Value'); + if (lock == 1) + pom= get(h_lock, 'UserData'); + if length(pom) ~= 4, + set(h_lock, 'Value', 0); + PERgraf('lock'); + return; + end + set(ha(3), 'Xlim', pom(1:2)); + set(ha(3), 'Ylim', pom(3:4)); + else + pom=get(hMenu,'UserData'); + min_per=pom(:,5); + max_per=pom(:,6); + if get(h_dB, 'UserData') %dB + ylim_=[min(min_per) max(max_per)*1.1]; + if isfinite(ylim_(2)) + ylim_(2)=2.^ceil(log2(ylim_(2))); + else + ylim_(2)=0; + end + warning off; + ylim_=10*log10(ylim_); + warning on; + tekst=get(hEdit_dY,'String'); + eval(['dY=' tekst ';'], 'dY=120;'); + if dY<=0, dY=10; end; + if isfinite(ylim_(1)) + ylim_(1)=2.^floor(log2(ylim_(1))); + else + ylim_(1)=ylim_(2)-dY; + end + if ylim_(2)-ylim_(1)>dY, + ylim_(1)=ylim_(2)-dY; + end + set(ha(3), 'Ylim', ylim_); + else + ylim_=2.^ceil(log2(max(max_per))); + set(ha(3), 'Ylim', [0 ylim_]); + end + + Re=get(h_real,'UserData'); + max_Fs = getMaxFs(h_Fs, hA); + if all(Re) + set(ha(3), 'Xlim', [0 max_Fs/2]); + else + set(ha(3), 'Xlim', [-max_Fs/2 max_Fs/2]); + end + end + pause(0); + % eval('zoom reset', 'set(get(ha(3),''ZLabel''),''UserData'',[]);'); + eval('rmappdata(get(ha(3),''Zlabel''),''ZOOMAxesData'')','set(get(ha(3),''ZLabel''),''UserData'',[])'); + % zoom on; + return + +elseif strcmp(Akcja, 'actionA') + redraw_ = 0; + A = get(hA.A_edit, 'UserData'); + if strcmp(param, 'A_edit') + % - "A_edit" + A_ = eval(get(hA.A_edit, 'String'), 'NaN'); + if ~isfinite(A_), + set(hA.A_edit, 'String', A.A); + else + A.A = A_; + if A.A < A.min; + A.A = A.min; + set(hA.A_edit, 'String', A.A); + end + if A.A > A.max; + A.A = A.max; + set(hA.A_edit, 'String', A.A); + end + set(hA.A_slider, 'Value', A.A); + redraw_ = 1; + end + + elseif strcmp(param, 'dA_edit') + % - "dA_edit" + dA_ = eval(get(hA.dA_edit, 'String'), 'NaN'); + if ~isfinite(dA_), + set(hA.dA_edit, 'String', A.dA); + else + A.dA = dA_; + end + + elseif strcmp(param, 'A_slider') + % - "A_slider" + A_ = get(hA.A_slider, 'Value'); + znak = sign(A_ - A.A); + if A.is_plus == 1, + A_ = A.A + znak*A.dA; + else % razy + if znak >= 0, + A_ = A.A*A.dA; + else + A_ = A.A/A.dA; + end + end + + A.A = A_; + if A.A < A.min; + A.A = A.min; + end + if A.A > A.max; + A.A = A.max; + end + set(hA.A_edit, 'String', A.A); + set(hA.A_slider, 'Value', A.A); + redraw_ = 1; + + elseif strcmp(param, 'minA_edit') + % - "minA_edit" + minA_ = eval(get(hA.minA_edit, 'String'), 'NaN'); + if ~isfinite(minA_), + set(hA.minA_edit, 'String', A.min); + else + if minA_ > A.max; + minA_ = A.min; + set(hA.minA_edit, 'String', minA_); + end + + A.min = minA_; + set(hA.A_slider, 'min', minA_); + + if A.A < A.min; + A.A = A.min; + set(hA.A_edit, 'String', A.A); + set(hA.A_slider, 'Value', A.A); + end + end + + elseif strcmp(param, 'maxA_edit') + % - "maxA_edit" + maxA_ = eval(get(hA.maxA_edit, 'String'), 'NaN'); + if ~isfinite(maxA_), + set(hA.maxA_edit, 'String', A.max); + else + if maxA_ < A.min; + maxA_ = A.max; + set(hA.maxA_edit, 'String', maxA_); + end + + A.max = maxA_; + set(hA.A_slider, 'max', maxA_); + + if A.A > A.max; + A.A = A.max; + set(hA.A_edit, 'String', A.A); + set(hA.A_slider, 'Value', A.A); + end + end + + elseif strcmp(param, 'A_razy_radio') + % - "A_razy_radio" +% val = get(A_plus_radio, 'Value'); +% if val > 0.0, +% A.is_plus = 1; +% else + A.is_plus = 0; +% end +% if A.is_plus == 1, +% set(hA.A_plus_radio, 'Value', 1.0); +% set(hA.A_razy_radio, 'Value', 0.0); +% else + set(hA.A_plus_radio, 'Value', 0.0); + set(hA.A_razy_radio, 'Value', 1.0); +% end + + elseif strcmp(param, 'A_plus_radio') + % - "A_plus_radio" +% val = get(A_razy_radio, 'Value'); +% if val > 0.0, +% A.is_plus = 0; +% else + A.is_plus = 1; +% end +% if A.is_plus == 1, + set(hA.A_plus_radio, 'Value', 1.0); + set(hA.A_razy_radio, 'Value', 0.0); +% else +% set(hA.A_plus_radio, 'Value', 0.0); +% set(hA.A_razy_radio, 'Value', 1.0); +% end + + end + + set(hA.A_edit, 'UserData', A); + supress_msgbox = 1; + if redraw_ == 1, + Ktory=get(hMenu,'Value'); + pom=get(hMenu,'UserData'); + ile=size(pom,1); + for ind=1:ile, + if ind ~= Ktory, + eval(sprintf('pergraf(''signal'', %i);', ind), 'set(fig, ''Pointer'', ''arrow'');'); + end + end + eval(sprintf('pergraf(''signal'', %i);', Ktory), 'set(fig, ''Pointer'', ''arrow'');'); + end + supress_msgbox = 0; + +end; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function x = getVal(tekst, def_val, hA, msg, Fs) + +global supress_msgbox + +if nargin == 4, + Fs = Inf; +end + +A = get(hA.A_edit, 'UserData'); +A = A.A; + +x = eval(tekst, 'NaN'); +if isnan(x), + x=def_val; + if supress_msgbox ==1, + warning(msg); + else + uiwait(msgbox(msg, 'modal')); + end +end + +function UpdatePergraphGUI(per_type, fig) + +hEditM=findobj(fig,'tag', 'M_edit'); +hLabelM=findobj(fig,'tag', 'M_label'); +hEditN=findobj(fig,'tag', 'N_edit'); +hLabelN=findobj(fig,'tag', 'N_label'); +hEditO=findobj(fig,'tag', 'O_edit'); +hLabelO=findobj(fig,'tag', 'O_label'); +hUnitO=findobj(fig,'tag', 'O_unit'); +hEditW=findobj(fig,'tag', 'w_edit'); +hLabelW=findobj(fig,'tag', 'w_label'); + +switch (per_type) + case 1, % raw periodograph + set(hEditM, 'Visible', 'off'); + set(hLabelM, 'Visible', 'off'); + set(hEditN, 'Visible', 'off'); + set(hLabelN, 'Visible', 'off'); + set(hEditO, 'Visible', 'off'); + set(hLabelO, 'Visible', 'off'); + set(hUnitO, 'Visible', 'off'); + set(hEditW, 'Visible', 'off'); + set(hLabelW, 'Visible', 'off'); + case 2, % modified periodograph + set(hEditM, 'Visible', 'off'); + set(hLabelM, 'Visible', 'off'); + set(hEditN, 'Visible', 'off'); + set(hLabelN, 'Visible', 'off'); + set(hEditO, 'Visible', 'off'); + set(hLabelO, 'Visible', 'off'); + set(hUnitO, 'Visible', 'off'); + set(hEditW, 'Visible', 'on'); + set(hLabelW, 'Visible', 'on'); + case 3, % Bartlett periodograph + set(hEditM, 'Visible', 'on'); + set(hLabelM, 'Visible', 'on'); + set(hEditN, 'Visible', 'on'); + set(hLabelN, 'Visible', 'on'); + set(hEditO, 'Visible', 'off'); + set(hLabelO, 'Visible', 'off'); + set(hUnitO, 'Visible', 'off'); + set(hEditW, 'Visible', 'on'); + set(hLabelW, 'Visible', 'on'); + case 4, % Welch periodograph + set(hEditM, 'Visible', 'on'); + set(hLabelM, 'Visible', 'on'); + set(hEditN, 'Visible', 'on'); + set(hLabelN, 'Visible', 'on'); + set(hEditO, 'Visible', 'on'); + set(hLabelO, 'Visible', 'on'); + set(hUnitO, 'Visible', 'on'); + set(hEditW, 'Visible', 'on'); + set(hLabelW, 'Visible', 'on'); + otherwise, + disp('Unsupported periodograph type'); +end; + +function maxFs = getMaxFs(h_Fs, hA) + +maxFs = 0; +pom = get(h_Fs, 'UserData'); +for ind=1:size(pom, 1); + tekst_Fs = pom(ind, :); + ind=find(tekst_Fs==0); + if ~isempty(ind) + tekst_Fs = tekst_Fs(1:ind(1)-1); + end; + Fs = getVal(tekst_Fs, Inf, hA, ['sampling rate error: >>' tekst_Fs '<<']); + if ~isfinite(Fs), + Fs = 1; + end; + maxFs = max([maxFs, Fs]); +end; + +function [x, Fs] = readaudiofile(filename, param) +% [x, Fs] = readaudiofile(filename, param) +% +% returns vector x of the size SIZE=[samples channels]. +% eg. x = x(:,1) + j*x(:,2); +% +% special uses: +% param == 'size': returns SIZE in x +% param == 'cplx': for stereo files returns x as a complex vector instead of matrix +% +% supported file types: +% *.flt +% *.wav +% *.tape +% last modification: 2021.03.29 +% Author: Marek Blok + +return_cplx = 0; +if nargin == 1, + param = inf; +else + if strcmp(param, 'cplx') == 1, + return_cplx = 1; + param = inf; + end +end + +ind = find(filename == '.'); +if length(ind) == 0, + file_type = 'w'; % *.wav +else + ind = ind(end); + + temp = filename(ind+1:end); + + file_type = 'u'; % unknown format + if strcmp(temp, 'flt') == 1, + file_type = 'f'; % two channel floting point + elseif strcmp(temp, 'wav') == 1, + file_type = 'w'; % *.wav + elseif strcmp(temp, 'tape') == 1, + file_type = 't'; % *.tape + end +end + +switch file_type, + case 'w', + if strcmp(param, 'size') == 1, + if exist('audioread','file') == 0 + x = wavread(filename, 'size'); + % siz = [samples channels]. + else + info = audioinfo(filename); + x = [info.TotalSamples, info.NumChannels]; + Fs = info.SampleRate; + end + else + if isfinite(param) + if exist('audioread','file') == 0 + [x, Fs] = wavread(filename, param); + else + if length(param) == 1 + param = [1, param]; + end + [x, Fs] = audioread(filename, param); + end + else + if exist('audioread','file') == 0 + [x, Fs] = wavread(filename); + else + [x, Fs] = audioread(filename); + end + end + end + + case 't' + plik = fopen(filename, 'rb'); + if plik == -1, + error('File does not exist !!!'); + end + + header.size = fread(plik, 1, 'uint32', 0) + 4; + + header.fname = char(fread(plik, 256, 'char', 0).'); + header.cfg_fname = char(fread(plik, 256, 'char', 0).'); + header.sw_rev = fread(plik, 1, 'uint32', 0); + header.hw_rev = fread(plik, 1, 'uint32', 0); + header.file_ = fread(plik, 1, 'uint32', 0); + header.tape_type = fread(plik, 1, 'uint32', 0); + header.start_time = fread(plik, 1, 'int32', 0); % time_t + header.end_time = fread(plik, 1, 'int32', 0); % time_t + + header.total_samples = fread(plik, 1, 'uint32', 0); + file_length = header.total_samples * 4 + header.size + header.current_sample = fread(plik, 1, 'uint32', 0); + header.loop_start = fread(plik, 1, 'int64', 0); + header.loop_end = fread(plik, 1, 'int64', 0); + header.loop = fread(plik, 1, 'int32', 0); + header.group_size_32 = fread(plik, 1, 'uint32', 0); + header.block_size = fread(plik, 1, 'uint32', 0); + header.block_count = fread(plik, 1, 'uint32', 0); + header.fifo_size = fread(plik, 1, 'uint32', 0); + + + header.comment = char(fread(plik, 256, 'char', 0).'); + header.tmp = char(fread(plik, 20, 'char', 0).'); % time_t + header.status = fread(plik, 1, 'uint32', 0); + header.timestamps = fread(plik, 1, 'int32', 0); + header.freq = fread(plik, 1, 'float', 0); + header.cplx_datarate = fread(plik, 1, 'float', 0); + +% ftell(plik) + header.reserved = fread(plik, 128, 'uint32', 0); +% header.reserved.' + +% header + ftell(plik) + + header.sample_type = 2; + header.ch_no = 2; + header.Fs = NaN; + + sample_type = 'int16'; + sample_size = 2; + + header_size = header.size; + if strcmp(param, 'size') == 1, + fseek(plik, 0, 'eof'); + size = (ftell(plik) - header_size) / sample_size / header.ch_no; % sizeof(float) *2 + x = size; + else + fseek(plik, header_size, 'bof'); + + len = param(1); + if length(param) > 1, + fseek(plik, sample_size*header.ch_no*(param(1)-1), 'cof'); + len = param(2) - param(1) + 1; + end + +% x = fread(plik, [header.ch_no, len], sample_type); + x = fread(plik, [header.ch_no, len], sample_type, 0); + x = x.'; + end + fclose(plik); + + case 'f' + plik = fopen(filename, 'rb'); + if plik == -1, + error('File does not exist !!!'); + end + + % 3 B - wersja pliku (w tym typ próbek) + % 1 B - liczba kanałów + % 4 B - szybkoć próbkowania + header_size = 8; + header.ver = fread(plik, 1, 'uint8'); + header.sample_type = fread(plik, 1, 'uint16'); + header.ch_no = fread(plik, 1, 'uint8'); + header.Fs = fread(plik, 1, 'uint32'); + + Fs = header.Fs; + + switch (header.ver), + case 0, + switch (header.sample_type), + case 0, + sample_type = 'float'; + sample_size = 4; + case 1, + sample_type = 'uchar'; + sample_size = 1; + case 2, + sample_type = 'short'; + sample_size = 2; + case 3, + sample_type = 'int'; + sample_size = 4; + otherwise + error('Unsupported *.flt sample type !!!'); + end + otherwise + error('Unsupported *.flt file version !!!'); + end + + + if strcmp(param, 'size') == 1, + fseek(plik, 0, 'eof'); + size = (ftell(plik) - header_size) / sample_size / header.ch_no; % sizeof(float) *2 + x = size; + else + len = param(1); + status = 0; + if length(param) > 1, + status = fseek(plik, sample_size*header.ch_no*(param(1)-1), 'cof'); + len = param(2) - param(1) + 1; + end + + if (status == -1) + x = []; + else + x = fread(plik, [header.ch_no, len], sample_type); + x = x.'; + end + end + + fclose(plik); + otherwise + error('Unsupported file format !!!'); +end + +if return_cplx == 1, + if length(x(1,:)) == 2, + x = x(:,1) + j*x(:,2); + end +end + +function UpdateFigTitle +fig=findobj(0, 'tag', 'perGUI'); +set(fig,'NumberTitle', 'off', 'Name',['Periodogram based power spectral desity estimators ver. 1.4.1 (Marek.Blok@pg.edu.pl 2021.04.09) ', pwd]); + + diff --git a/Ex2/matlab/SPECgraf.m b/Ex2/matlab/SPECgraf.m new file mode 100644 index 0000000..d892ec7 --- /dev/null +++ b/Ex2/matlab/SPECgraf.m @@ -0,0 +1,1436 @@ +function varargout = SPECgraf(Akcja, param) +%cos(cumsum(n/1000)) + +% \fixed 2017.03.22 psd ==> pwelch +% \fixed 2012.03.05 finite ==> isfinite +% \fixed 2006.10.11 dealt with LineStyle/Marker warning +% \fixed 2005.11.20 dealt with "Warning: Log of zero." in ylim evaluation +% \fixed 2005.11.20 Placed all in single file +% \fixed 2005.11.20 Fixed problems with zoom out + +if nargin == 0 % LAUNCH GUI + +% fig = openfig(mfilename,'reuse'); return; %ZapiszFig(1,'specGUI.m') + if isempty(findobj(0, 'tag', 'Specgraf_DrawFig')) + + fig = Specgraf_DrawFig; + set(fig,'tag', 'Specgraf_DrawFig', 'Units', 'pixels'); + set(fig,'name', 'Spektrogram sygnałów niestacjonarnych (2017.03.22) dr inż. Marek Blok)',... + 'KeyPressFcn','1;'); + + SPECgraf('Init'); + SPECgraf('signal'); + set(fig,'Visible','on'); +% SPECgraf('per'); + else + SPECgraf('Exit'); + end + return; +end; + +if ~isstr(Akcja) % INVOKE NAMED SUBFUNCTION OR CALLBACK + disp('Something''s wrong'); + return; +end; + +% Generate a structure of handles to pass to callbacks, and store it. +fig=findobj(0, 'tag', 'Specgraf_DrawFig'); +hEditN=findobj(fig,'tag', 'N_edit'); +hEditM=findobj(fig,'tag', 'M_edit'); +hEditL=findobj(fig,'tag', 'L_edit'); +hEditK=findobj(fig,'tag', 'K_edit'); +hEditO=findobj(fig,'tag', 'O_edit'); +hEditW=findobj(fig,'tag', 'w_edit'); +hEditX=findobj(fig,'tag', 'x_edit'); +h_real=findobj(fig,'tag', 'real_checkbox'); +h_dB=findobj(fig,'tag', 'dB_checkbox'); +hEditNoise=findobj(fig,'tag', 'Noise_edit'); +hEditName=findobj(fig,'tag', 'Name_edit'); +hMenu=findobj(fig,'tag', 'choose_popupmenu'); +h_det=findobj(fig,'tag', 'detrend_checkbox'); +ha=get(fig, 'UserData'); +Ktory=get(hMenu,'Value'); +hEdit_dY=findobj(fig,'tag', 'dY_edit'); + +if strcmp(Akcja, 'Exit') + close(fig); + return; +elseif strcmp(Akcja, 'Init') + set(hEditX,'UserData','randn(1,L)'); + set(hEditX,'String','randn(1,L)'); + set(hEditX,'Max', 2); + + set(hEditW,'UserData','boxcar(M)'); + set(hEditW,'String','boxcar(M)'); + + set(hEditL,'UserData','1000'); + set(hEditL,'String','1000'); + set(hEditM,'UserData','100'); + set(hEditM,'String','100'); + set(hEditNoise,'UserData','-100'); + set(hEditNoise,'String','-100'); + +% set(hEditN,'UserData','1'); +% set(hEditN,'String','1'); + set(hEditO,'UserData','0'); + set(hEditO,'String','0'); + + set(hEditK,'UserData','256'); + set(hEditK,'String','256'); + + set(hEditName,'String','new'); + set(hMenu,'String','new'); + + set(h_real,'UserData',1); + set(h_real,'Value',1); + + set(h_dB,'UserData',0); + set(h_dB,'Value',0); + + set(h_det,'UserData',1); + set(h_det,'Value',1); + + ha(1)=findobj(fig,'tag', 'Signal_re_axes'); + ha(2)=findobj(fig,'tag', 'Signal_im_axes'); + ha(3)=findobj(fig,'tag', 'spec_axes'); + ha(4)=findobj(fig,'tag', 'per_axes'); +% for ind=[1 2 4], axes(ha(ind)); zoom on; end; +% axes(ha(3)); zoom off; + + set(fig, 'UserData', ha); + + set(hMenu,'UserData', [NaN, NaN, NaN, NaN, NaN, NaN, NaN, 1, -100, 5, -100, 5]); %handles & maximal values + set(hEdit_dY,'String','120'); + return; +elseif strcmp(Akcja, 'change_name') + pom=get(hMenu,'String'); + pom2=get(hEditName,'String'); + pom(Ktory,1:length(pom2)+1)=[pom2 0]; + set(hMenu,'String',pom); + set(hMenu, 'Value', Ktory); + return; +elseif strcmp(Akcja, 'new') + pom=get(hMenu,'String'); + Ktory=size(pom,1)+1; + pom(Ktory,1:4)=['new' 0]; + set(hMenu,'String',pom); + + + pom=get(hEditX,'UserData'); + pom(Ktory,1:11)=['randn(1,L)' 0]; + set(hEditX,'UserData',pom); + pom=get(hEditW,'UserData'); + pom(Ktory,1:10)=['boxcar(M)' 0]; + set(hEditW,'UserData',pom); + + pom=get(hEditL,'UserData'); + pom(Ktory,1:4)=['100' 0]; + set(hEditL,'UserData',pom); + pom=get(hEditM,'UserData'); + pom(Ktory,1:4)=['100' 0]; + set(hEditM,'UserData',pom); + pom=get(hEditNoise,'UserData'); + pom(Ktory,1:5)=['-100' 0]; + set(hEditNoise,'UserData',pom); + +% pom=get(hEditN,'UserData'); +% pom(Ktory,1:2)=['1' 0]; +% set(hEditN,'UserData',pom); + pom=get(hEditO,'UserData'); + pom(Ktory,1:2)=['0' 0]; + set(hEditO,'UserData',pom); + + pom=get(hEditK,'UserData'); + pom(Ktory,1:5)=['256' 0]; + set(hEditK,'UserData',pom); + + pom=get(hMenu,'UserData'); + pom(Ktory,1:size(pom,2))=ones(1,size(pom,2))*NaN; + set(hMenu,'UserData',pom); + + pom=get(h_real,'UserData'); + pom(Ktory,1)=1; + set(h_real,'Value', pom(Ktory,1)); + set(h_real,'UserData',pom); + + pom=get(h_det,'UserData'); + pom(Ktory,1)=1; + set(h_det,'Value', pom(Ktory,1)); + set(h_det,'UserData',pom); + + set(hMenu,'Value', Ktory); + + SPECgraf('Choose'); + SPECgraf('signal', Ktory); + return; +elseif strcmp(Akcja, 'delete') + pom=get(hMenu,'String'); + if size(pom,1)==1, + %SPECgraf('Reset'); + return; + end; + pom(Ktory,:)=[]; + set(hMenu,'String',pom); + + + pom=get(hEditX,'UserData'); + pom(Ktory,:)=[]; + set(hEditX,'UserData',pom); + pom=get(hEditW,'UserData'); + pom(Ktory,:)=[]; + set(hEditW,'UserData',pom); + + pom=get(hEditL,'UserData'); + pom(Ktory,:)=[]; + set(hEditL,'UserData',pom); + pom=get(hEditM,'UserData'); + pom(Ktory,:)=[]; + set(hEditM,'UserData',pom); + pom=get(hEditNoise,'UserData'); + pom(Ktory,:)=[]; + set(hEditNoise,'UserData',pom); + +% pom=get(hEditN,'UserData'); +% pom(Ktory,:)=[]; +% set(hEditN,'UserData',pom); + pom=get(hEditO,'UserData'); + pom(Ktory,:)=[]; + set(hEditO,'UserData',pom); + + pom=get(hEditK,'UserData'); + pom(Ktory,:)=[]; + set(hEditK,'UserData',pom); + + pom=get(hMenu,'UserData'); + for ind=1:3, + if isfinite(pom(Ktory,ind)) + delete(pom(Ktory,ind)); + end + end + pom(Ktory,:)=[]; + set(hMenu,'UserData',pom); + + pom=get(h_real,'UserData'); + pom(Ktory,:)=[]; + set(h_real,'UserData',pom); + + pom=get(h_det,'UserData'); + pom(Ktory,:)=[]; + set(h_det,'UserData',pom); + + set(hMenu,'Value', 1); + +% SPECgraf('signal', Ktory); + SPECgraf('Choose'); + return; + + +elseif strcmp(Akcja, 'Choose') + %selected new filter response + pom=get(hMenu,'String'); + ind=find(pom(Ktory,:)==0); + if isempty(ind) + ind=size(pom,2); + else + ind=ind(1)-1; + end + set(hEditName,'String',pom(Ktory,1:ind)); + + pom=get(hEditX,'UserData'); + set(hEditX, 'String', pom(Ktory,:)); + pom=get(hEditW,'UserData'); + set(hEditW, 'String', pom(Ktory,:)); + + pom=get(hEditL,'UserData'); + set(hEditL, 'String', pom(Ktory,:)); + pom=get(hEditM,'UserData'); + set(hEditM, 'String', pom(Ktory,:)); + pom=get(hEditNoise,'UserData'); + set(hEditNoise, 'String', pom(Ktory,:)); + +% pom=get(hEditN,'UserData'); +% set(hEditN, 'String', pom(Ktory,:)); + pom=get(hEditO,'UserData'); + set(hEditO, 'String', pom(Ktory,:)); + + pom=get(hEditK,'UserData'); + set(hEditK, 'String', pom(Ktory,:)); + + pom=get(h_real,'UserData'); + set(h_real,'Value', pom(Ktory,1)); + + pom=get(h_det,'UserData'); + set(h_det,'Value', pom(Ktory,1)); + +% SPECgraf('signal', Ktory); + return; + +elseif strcmp(Akcja, 'signal') + if nargin==2, + Ktory=param; + else + %save strings + tekst=[get(hEditL, 'String') 0]; + pom=get(hEditL,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditL,'UserData', setstr(pom)); + + tekst=[get(hEditNoise, 'String') 0]; + pom=get(hEditNoise,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditNoise,'UserData', setstr(pom)); + + tekst=get(hEditX, 'String').'; + tekst=[tekst(:); 0].'; + pom=get(hEditX,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditX,'UserData', setstr(pom)); + + tekst=get(h_real, 'Value'); + pom=get(h_real,'UserData'); + pom(Ktory,1)=tekst; + set(h_real,'UserData', pom); + end; + + pom=get(hMenu,'UserData'); + hp_re=pom(:,1); + hp_im=pom(:,2); + hp_spec_t=pom(:,3); + hp_spec_t2=pom(:,4); + hp_spec=pom(:,5); + hp_per=pom(:,6); + hp_per2=pom(:,7); + max_x=pom(:,8); + min_spec=pom(:,9); + max_spec=pom(:,10); + min_per=pom(:,11); + max_per=pom(:,12); + + %generate signal + tekstL=get(hEditL,'UserData'); tekstL=tekstL(Ktory,:); + ind=find(tekstL==0); + if ~isempty(ind) + tekstL=tekstL(1:ind(1)-1); + end; + eval(['L=' tekstL ';'], 'L=1;') + + n=0:L-1; + tekstX=get(hEditX,'UserData'); tekstX=tekstX(Ktory,:); + ind=find(tekstX==0); + if ~isempty(ind) + tekstX=tekstX(1:ind(1)-1); + end; + eval(['x=' tekstX ';'], 'x=zeros(1,L);') + + Re=get(h_real,'UserData'); Re=Re(Ktory,1); + + tekstNoise=get(hEditNoise,'UserData'); tekstNoise=tekstNoise(Ktory,:); + ind=find(tekstNoise==0); + if ~isempty(ind) + tekstNoise=tekstNoise(1:ind(1)-1); + end; + eval(['Noise=' tekstNoise ';'], 'Noise=-300;') + + x=x(:); + if length(x)<L; + x(L)=0; + else + x=x(1:L); + end; + + N_lin=10.^(Noise/20); + if Re==1 + x=real(x)+N_lin*randn(size(x)); + else + x=x+N_lin*(randn(size(x))+j*randn(size(x)))/sqrt(2); + end; + max_x(Ktory)=max(abs([real(x); imag(x)])); + + %draw signal + + %real part of the signal + axes(ha(1)); + if isnan(hp_re(Ktory)) + hold on; + hp_re(Ktory)=plot(n,real(x), 'Color', 'b'); + hold off; + else + set(hp_re(Ktory),'Xdata', n, 'Ydata', real(x)); + end +% set(ha(1), 'Xlim', [-0.5, L-0.5], 'Ylim', [-1.1 1.1]*max(max_x)); +% eval('zoom reset', 'set(get(ha(1),''ZLabel''),''UserData'',[]);'); +% reset(get(ha(1),'ZLabel')); + + %imaginary part of the signal +% axes(ha(2)); + if isnan(hp_im(Ktory)) + hold on; + hp_im(Ktory)=plot(n,imag(x), 'Color', 'r'); + hold off; + else + set(hp_im(Ktory),'Xdata', n, 'Ydata', imag(x)); + end + set(ha(1), 'Xlim', [-0.5, L-0.5], 'Ylim', [-1.1 1.1]*max(max_x)); +% set(get(ha(2),'ZLabel'),'UserData',[]); +% reset(get(ha(2),'ZLabel')); +% eval('zoom reset', 'set(get(ha(1),''ZLabel''),''UserData'',[]);'); + if L>512 + set([hp_re, hp_im], 'Marker', '.', 'MarkerSize', 4); + else + set([hp_re, hp_im], 'LineStyle', '-'); + end; + eval('rmappdata(get(ha(1),''Zlabel''),''ZOOMAxesData'')','set(get(ha(1),''ZLabel''),''UserData'',[])'); + + set(hMenu,'UserData', [hp_re, hp_im, hp_spec_t, hp_spec_t2, hp_spec, hp_per, hp_per2, max_x, min_spec, max_spec, min_per, max_per]); + + %compute and draw periodogram + SPECgraf('spec', Ktory) +% SPECgraf zoom_on; + return; + +elseif strcmp(Akcja, 'spec') + if nargin==2, + Ktory=param; + else + %save strings + tekst=[get(hEditK, 'String') 0]; + pom=get(hEditK,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditK,'UserData', setstr(pom)); + + tekst=[get(hEditM, 'String') 0]; + pom=get(hEditM,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditM,'UserData', setstr(pom)); + +% tekst=[get(hEditN, 'String') 0]; +% pom=get(hEditN,'UserData'); +% pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... +% zeros(1, max([1; size(pom,2); length(tekst)])); +% pom(Ktory,1:length(tekst))=tekst; +% set(hEditN,'UserData', setstr(pom)); + + tekst=[get(hEditO, 'String') 0]; + pom=get(hEditO,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditO,'UserData', setstr(pom)); + + tekst=[get(hEditW, 'String') 0]; + pom=get(hEditW,'UserData'); + pom(Ktory,1:max([1; size(pom,2); length(tekst)]))= ... + zeros(1, max([1; size(pom,2); length(tekst)])); + pom(Ktory,1:length(tekst))=tekst; + set(hEditW,'UserData', setstr(pom)); + + tekst=get(h_det, 'Value'); + pom=get(h_det,'UserData'); + pom(Ktory,1)=tekst; + set(h_det,'UserData', pom); + end; + + pom=get(hMenu,'UserData'); + hp_re=pom(:,1); + hp_im=pom(:,2); + hp_spec_t=pom(:,3); + hp_spec_t2=pom(:,4); + hp_spec=pom(:,5); + hp_per=pom(:,6); + hp_per2=pom(:,7); + max_x=pom(:,8); + min_spec=pom(:,9); + max_spec=pom(:,10); + min_per=pom(:,11); + max_per=pom(:,12); + + %generate signal + tekstK=get(hEditK,'UserData'); tekstK=tekstK(Ktory,:); + ind=find(tekstK==0); + if ~isempty(ind) + tekstK=tekstK(1:ind(1)-1); + end; + eval(['K=' tekstK ';'], 'K=16;') + + tekstM=get(hEditM,'UserData'); tekstM=tekstM(Ktory,:); + ind=find(tekstM==0); + if ~isempty(ind) + tekstM=tekstM(1:ind(1)-1); + end; + eval(['M=' tekstM ';'], 'M=16;') + if M>K + M=K; + set(hEditM,'String', num2str(M)); + end; + +% tekstN=get(hEditN,'UserData'); tekstN=tekstN(Ktory,:); +% ind=find(tekstN==0); +% if ~isempty(ind) +% tekstN=tekstN(1:ind(1)-1); +% end; +% eval(['N=' tekstN ';'], 'N=16;') + + tekstO=get(hEditO,'UserData'); tekstO=tekstO(Ktory,:); + ind=find(tekstO==0); + if ~isempty(ind) + tekstO=tekstO(1:ind(1)-1); + end; +% eval(['O=' tekstO ';'], 'O=0;') + O=eval(tekstO, '0'); % \Fixed 2005.11.03 + O=round(O/100*M); % \Fixed 2005.11.03 nakładkowanie podawane w procentach !!! + + + tekstW=get(hEditW,'UserData'); tekstW=tekstW(Ktory,:); + ind=find(tekstW==0); + if ~isempty(ind) + tekstW=tekstW(1:ind(1)-1); + end; + eval(['w=' tekstW ';'], 'w=ones(1,M);') + + w=w(:); + if length(w)<M; + w(M)=0; + else + w=w(1:M); + end; + + x=get(hp_re(Ktory), 'Ydata')+j*get(hp_im(Ktory), 'Ydata'); + +% O=floor(O/100*M); % \Fixed 2005.11.03 + if O>=M + O=M-1; + set(hEditO,'String', num2str(O/M*100)); + end; + N = fix((length(x)-O)/(M-O)); + set(hEditN, 'String', sprintf('%i', N)); + +% det_=get(h_det,'UserData'); det_=det_(Ktory,1); +% if det_==0, +% det='none'; +% else +% det_='linear'; +% end; + + [Spec, f, t]=specgram(x, K, 1, w, O); + Spec=(abs(Spec).^2)/norm(w)^2; +% [Per, f2]=psd(x, K, 1, w, O); + [Per, f2]=pwelch(x, w, O, K, 1); + Spec=abs(Spec); + + Re=get(h_real,'UserData'); + if ~Re(Ktory,1) + f=fftshift(f); + f(1:floor(K/2))=f(1:floor(K/2))-1; + f2=fftshift(f2); + f2(1:floor(K/2))=f2(1:floor(K/2))-1; + Spec=[Spec(ceil(K/2):K,:); Spec(1:floor(K/2),:)]; + Per=fftshift(Per); + end + + min_spec(Ktory)=min([min(Spec(isfinite(Spec))); 0]); + max_spec(Ktory)=max([max(Spec(isfinite(Spec))); 0.001]); + min_per(Ktory)=min([min(Per(isfinite(Per))); 0]); + max_per(Ktory)=max([max(Per(isfinite(Per))); 0.001]); + if get(h_dB, 'UserData') %dB + Spec=10*log10(Spec); + Per=10*log10(Per); + end + set(get(ha(2),'Ylabel'),'UserData', f); + set(get(ha(3),'Ylabel'),'UserData', Spec); + set(get(ha(4),'Ylabel'),'UserData', Per); + + %draw signal + axes(ha(2)); + if length(t)>1 + t2=t+(t(2)-t(1))/2; + else + t2=M/2; + end; + + if isnan(hp_spec_t(Ktory)) + hold on; +% hp_spec_t(Ktory)=plot(t2,max(Spec), 'Color', 'k'); + pomoc=abs(get(hp_re(Ktory),'Ydata')+j*get(hp_im(Ktory),'Ydata')); + hp_spec_t(Ktory)=plot(get(hp_re(Ktory),'Xdata'), pomoc, 'Color', 'k'); + if length(pomoc)>512 + set(hp_spec_t(Ktory), 'Marker', '.', 'MarkerSize', 4); + else + set(hp_spec_t(Ktory), 'LineStyle', '-'); + end; + hold off; + else +% set(hp_spec_t(Ktory),'Xdata', t2, 'Ydata', max(Spec), 'Color', 'k'); + set(hp_spec_t(Ktory),'Xdata', get(hp_re(Ktory),'Xdata'),... + 'Ydata', abs(get(hp_re(Ktory),'Ydata')+j*get(hp_im(Ktory),'Ydata')), 'Color', 'k'); + end + if length(t)==1, + set(ha(2), 'Xlim', [t(1)-0.5 t(1)+0.5], 'Ylim', [-1.1 1.1]*max(max_x)); + else + set(ha(2), 'Xlim', [t(1) t(length(t))+(t(2)-t(1))], 'Ylim', [-1.1 1.1]*max(max_x)); + end; +% set(get(ha(2),'ZLabel'),'UserData',[]); +% reset(get(ha(2),'ZLabel')); + eval('rmappdata(get(ha(2),''Zlabel''),''ZOOMAxesData'')','set(get(ha(2),''ZLabel''),''UserData'',[])'); + + %spektrogram + axes(ha(3)); + if isnan(hp_spec(Ktory)) + hold on; + hp_spec(Ktory)=image(t2, f, Spec); + colormap(hot); + hold off; + else + set(hp_spec(Ktory),'Xdata', t2, 'Ydata', f, 'Cdata', Spec); + end + if length(t)==1, + tlim_=[t(1)-0.5 t(1)+0.5]; + else + tlim_=[t(1) t(length(t))+t(2)-t(1)]; + end; + if all(Re) + set(ha(3), 'Ylim', [0 0.5], 'Xlim', tlim_); + else + set(ha(3), 'Ylim', [-0.5 0.5], 'Xlim', tlim_); + end +% set(get(ha(3),'ZLabel'),'UserData',[]); +% reset(get(ha(3),'ZLabel')); + eval('zoom reset', 'set(get(ha(3),''ZLabel''),''UserData'',[]);'); + + axes(ha(4)); + if isnan(hp_per(Ktory)) + hold on; + hp_per(Ktory)=plot(Per, f2, 'Color', 'k'); + hold off; + else + set(hp_per(Ktory),'Ydata', f2, 'Xdata', Per, 'Color', 'k'); + end + set(ha(4), 'Xdir', 'reverse', 'YTick', []); %, 'Xlim', [t(1) t(length(t))], 'Ylim', [-1.1 1.1]*max(max_x)); + if all(Re) + set(ha(4), 'Ylim', [0 0.5]); + else + set(ha(4), 'Ylim', [-0.5 0.5]); + end + eval('rmappdata(get(ha(4),''Zlabel''),''ZOOMAxesData'')','set(get(ha(4),''ZLabel''),''UserData'',[])'); + + set(hMenu,'UserData', [hp_re, hp_im, hp_spec_t, hp_spec_t2, hp_spec, hp_per, hp_per2, max_x, min_spec, max_spec, min_per, max_per]); + + % delete + if 1 + pom=get(hMenu,'UserData'); + hp_=pom(:,[4,7]); + hp_=hp_(isfinite(hp_)); + if length(hp_)>0 + delete(hp_) + pom(:,4)=NaN; + pom(:,7)=NaN; + set(hMenu,'UserData',pom); + end; + end + + SPECgraf('spec_ylim'); + SPECgraf zoom_on; + SPECgraf zoom_off; + return; + +elseif strcmp(Akcja, 'dB') + pom=get(h_dB, 'UserData'); + if pom~=get(h_dB, 'Value') + pom=get(hMenu,'UserData'); + hp_spec=pom(:,3); + for ind=1:length(hp_spec) + sygn=get(get(ha(3),'Ylabel'),'UserData'); + per=get(get(ha(4),'Ylabel'),'UserData'); + if get(h_dB, 'Value') %dB + sygn=10*log10(sygn); + per=10*log10(per); + else %lin + sygn=10.^(sygn/10); + per=10.^(per/10); + end; + set(get(ha(3),'Ylabel'),'UserData', sygn); + set(get(ha(4),'Ylabel'),'UserData', per); +% set(hp_spec(ind),'Cdata', sygn); + end; + set(h_dB, 'UserData', get(h_dB, 'Value')); + + hp_=pom(:,[4 7]); + hp_=hp_(isfinite(hp_)); + if length(hp_)>0 + delete(hp_) + pom(:,4)=NaN; + pom(:,7)=NaN; + set(hMenu,'UserData',pom); + end; + SPECgraf('spec_ylim'); + end + return + +elseif strcmp(Akcja, 'spec_ylim') + pom=get(hMenu,'UserData'); + hp_re=pom(:,1); + hp_im=pom(:,2); + hp_spec_t=pom(:,3); + hp_spec=pom(:,5); + hp_per=pom(:,6); + min_spec=pom(:,9); + max_spec=pom(:,10); + min_per=pom(:,11); + max_per=pom(:,12); + if get(h_dB, 'UserData') %dB + tekst=get(hEdit_dY,'String'); + eval(['dY=' tekst ';'], 'dY=120;'); + if dY<=0, dY=10; end; + params_=[min(min_spec) max(max_spec)]; + ind_params = find(abs(params_) <= eps); + if length(ind_params) > 0, + params_(ind_params) = NaN*ones(size(ind_params)); + end + ylim_=10*log10(params_); + if ~isfinite(ylim_(2)) + ylim_(2)=0; + end + ylim_(1)=ylim_(2)-dY; + params_=[min(min_per) max(max_per)]; + ind_params = find(abs(params_) <= eps); + if length(ind_params) > 0, + params_(ind_params) = NaN*ones(size(ind_params)); + end + ylim_per=10*log10(params_); + if ~isfinite(ylim_per(2)) + ylim_per(2)=0; + end + ylim_per(1)=ylim_per(2)-dY; + else + ylim_=[0 max(max_spec)]; + ylim_per=[0 max(max_per)]; + end + ylim_per(2)=max([ylim_per(2) ylim_(2)]); + f=get(get(ha(2),'Ylabel'),'UserData'); + Spec=get(get(ha(3),'Ylabel'),'UserData'); + Per=get(get(ha(4),'Ylabel'),'UserData'); + set(hp_spec_t(Ktory),'Ydata', abs(get(hp_re(Ktory),'Ydata')+j*get(hp_im(Ktory),'Ydata'))); + set(ha(2),'Ylim', ylim_+(ylim_(2)-ylim_(1))*[-0.1 0.1]); + Spec=64*(Spec-ylim_(1))/(ylim_(2)-ylim_(1)); + + set(hp_spec(Ktory),'Cdata', Spec); + set(hp_per(Ktory),'Xdata', Per, 'Ydata', f); + set(ha(4),'Xlim', ylim_per); + + if get(h_dB, 'UserData') %dB + set(hp_spec_t(Ktory),'Ydata', 20*log10(abs(get(hp_re(Ktory),'Ydata')+j*get(hp_im(Ktory),'Ydata')))); + else + set(hp_spec_t(Ktory),'Ydata', abs(get(hp_re(Ktory),'Ydata')+j*get(hp_im(Ktory),'Ydata'))); + end + + SPECgraf zoom_on; + eval('zoom reset', 'set(get(ha(3),''ZLabel''),''UserData'',[]);'); + SPECgraf zoom_off; + return +elseif strcmp(Akcja, 'zoom_on') + zoom on; +% pom=get(fig, 'WindowButtonDownFcn'); +% set(fig, 'WindowButtonDownFcn', 'SPECgraf zoom'); +% set(get(ha(3),'Xlabel'), 'UserData', pom); + return; +elseif strcmp(Akcja, 'zoom_off') + if get(findobj(fig,'tag','checkbox_zoom'),'Value') == 0, +% pom = get(get(ha(3),'Xlabel'), 'UserData'); +% set(fig, 'WindowButtonDownFcn', pom); + zoom off; + set(fig, 'WindowButtonDownFcn', 'SPECgraf zoom'); + set(get(ha(3),'Xlabel'), 'UserData', '1;'); + end + return; +elseif strcmp(Akcja, 'zoom_spec') + if get(findobj(fig,'tag','checkbox_zoom'),'Value') ~= 0, + Specgraf zoom_on; + else + Specgraf zoom_off; + end +elseif strcmp(Akcja, 'zoom') +% if strcmp(get(fig,'SelectionType'),'normal') | (gca~=ha(3)) + pause(0); + if (get(gco,'Parent')~=ha(3)) | get(findobj(fig,'tag','checkbox_zoom'),'Value') + eval(get(get(ha(3),'Xlabel'), 'UserData')); + elseif get(gco,'Parent')==ha(3) + pom=get(ha(3), 'CurrentPoint'); + f_=pom(1,2); t_=pom(1,1); + + pom_=get(hMenu,'UserData'); + hp_spec_t2=pom_(:,4); + hp_spec=pom_(:,5); + hp_per2=pom_(:,7); + f=get(hp_spec(Ktory), 'Ydata'); + ind_f=find(abs(f-f_)==min(abs(f-f_))); ind_f=ind_f(1); + t=get(hp_spec(Ktory), 'Xdata'); +% if length(t)>1, +% t=t+(t(2)-t(1))/2; +% end; + ind_t=find(abs(t-t_)==min(abs(t-t_))); + ind_t=ind_t(1); + set(findobj(fig,'tag', 'text_t_f'),... + 'ForegroundColor', 'r', 'String', sprintf('n=%i, f=%6.3f', t(ind_t),f(ind_f))); + + Spec=get(get(ha(3),'Ylabel'),'UserData'); + axes(ha(4)); + if length(Spec(:,ind_t))>length(f) + ind=find(f==0); + Spec(ind(1),:)=[]; + end; + if isnan(hp_per2(Ktory)) + hold on; + hp_per2(Ktory)=plot(Spec(:,ind_t),f, 'Color', 'r', 'LineWidth', 2); + hold off; + else + set(hp_per2(Ktory),'Xdata', Spec(:,ind_t), 'Ydata', f); + end +% pom=get(ha(4), 'Xlim'); +% pom(2)=max([pom(2) max(Spec(:,ind_t))]); +% set(ha(4),'Xlim', pom); + + axes(ha(2)); + if isnan(hp_spec_t2(Ktory)) + hold on; + hp_spec_t2(Ktory)=plot(t,Spec(ind_f,:), 'Color', 'r', 'LineWidth', 2); + hold off; + SPECgraf zoom_on; + SPECgraf zoom_off; + else + set(hp_spec_t2(Ktory),'Xdata', t, 'Ydata', Spec(ind_f,:)); + end + + pom_(Ktory,7)=hp_per2; + pom_(Ktory,4)=hp_spec_t2; + set(hMenu,'UserData',pom_); + end; + return; +end; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function fig_h=Specgraf_DrawFig +fig_h=figure; +set(fig_h, ... + 'Units', 'Normalized',... + 'Position', [0.1125 0.1188 0.7813 0.7448],... + 'Color', [1.0000 1.0000 1.0000],... + 'Name', 'Untitled',... + 'NumberTitle', 'off',... + 'Menu', 'none',... + 'Tag', 'figure1'... + ); +h=axes; +set(h, ... + 'Units', 'Normalized',... + 'Position', [0.0330 0.0881 0.2150 0.4867],... + 'Color', [1.0000 1.0000 1.0000],... + 'XColor', [0.0000 0.0000 0.0000],... + 'YColor', [0.0000 0.0000 0.0000],... + 'FontSize', 10,... + 'Box', 'on',... + 'Tag', 'per_axes'... + ); +h=axes; +set(h, ... + 'Units', 'Normalized',... + 'Position', [0.2900 0.6350 0.6990 0.1538],... + 'Color', [1.0000 1.0000 1.0000],... + 'XColor', [0.0000 0.0000 0.0000],... + 'YColor', [0.0000 0.0000 0.0000],... + 'FontSize', 10,... + 'Box', 'on',... + 'Tag', 'Signal_im_axes'... + ); +h=axes; +set(h, ... + 'Units', 'Normalized',... + 'Position', [0.2880 0.0867 0.7030 0.4867],... + 'Color', [1.0000 1.0000 1.0000],... + 'XColor', [0.0000 0.0000 0.0000],... + 'YColor', [0.0000 0.0000 0.0000],... + 'FontSize', 10,... + 'Box', 'on',... + 'Tag', 'spec_axes'... + ); +h=axes; +set(h, ... + 'Units', 'Normalized',... + 'Position', [0.2920 0.8266 0.6980 0.1580],... + 'Color', [1.0000 1.0000 1.0000],... + 'XColor', [0.0000 0.0000 0.0000],... + 'YColor', [0.0000 0.0000 0.0000],... + 'FontSize', 10,... + 'Box', 'on',... + 'Tag', 'Signal_re_axes'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'frame',... + 'Units', 'Normalized',... + 'Position', [0.0050 0.7972 0.2400 0.1930],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'frame2'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'frame',... + 'Units', 'Normalized',... + 'Position', [0.0050 0.5916 0.2400 0.2028],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'frame4'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1190 0.6364 0.0280 0.0350],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', '[%]',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text23'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.8720 0.0126 0.0660 0.0196],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'zoom',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'Specgraf zoom_spec',... + 'Tag', 'checkbox_zoom'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.0140 0.0098 0.0660 0.0378],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'Exit',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf Exit',... + 'Tag', 'pushbutton5'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.4640 0.0028 0.3540 0.0350],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text_t_f'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1750 0.0126 0.0750 0.0364],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''spec_ylim'')',... + 'Tag', 'dY_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1110 0.0154 0.0620 0.0308],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'dY [dB] =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text21'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.9270 0.5748 0.0500 0.0322],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'dB',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''dB'')',... + 'Tag', 'dB_checkbox'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.0660 0.4909 0.0600 0.0420],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'Delete',... + 'Value', 0,... + 'Visible', 'off',... + 'Callback', 'SPECgraf(''delete'')',... + 'Tag', 'pushbutton4'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.0120 0.4909 0.0480 0.0420],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'New',... + 'Value', 0,... + 'Visible', 'off',... + 'Callback', 'SPECgraf(''new'')',... + 'Tag', 'pushbutton3'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1580 0.6769 0.0750 0.0364],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''spec'')',... + 'Tag', 'N_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1280 0.6825 0.0300 0.0266],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'N =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text18'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0390 0.8014 0.0720 0.0378],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''signal'')',... + 'Tag', 'L_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0090 0.8028 0.0290 0.0266],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'L =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text17'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.1290 0.7301 0.1100 0.0252],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'detrend',... + 'Value', 0,... + 'Visible', 'off',... + 'Callback', 'SPECgraf(''spec'')',... + 'Tag', 'detrend_checkbox'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0400 0.6378 0.0750 0.0364],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''spec'')',... + 'Tag', 'O_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0110 0.6378 0.0280 0.0294],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'O =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text16'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0520 0.6000 0.1870 0.0336],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''spec'')',... + 'Tag', 'w_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0130 0.5986 0.0400 0.0294],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'w[n] =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text15'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1670 0.8042 0.0720 0.0364],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''signal'')',... + 'Tag', 'Noise_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1190 0.8042 0.0470 0.0266],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'Noise=',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text14'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0410 0.6769 0.0750 0.0364],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''spec'')',... + 'Tag', 'M_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0110 0.6825 0.0300 0.0266],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'M =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text13'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1340 0.4909 0.1030 0.0392],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'off',... + 'Callback', 'SPECgraf(''change_name'')',... + 'Tag', 'Name_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'popupmenu',... + 'Units', 'Normalized',... + 'Position', [0.0120 0.5413 0.2260 0.0294],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Popup Menu',... + 'Value', 1,... + 'Visible', 'off',... + 'Callback', 'SPECgraf(''Choose'')',... + 'Tag', 'choose_popupmenu'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.1160 0.9580 0.1110 0.0266],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'real signal',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''signal'')',... + 'Tag', 'real_checkbox'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0100 0.7622 0.1470 0.0266],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'Spectrograf parameters',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text10'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0400 0.7259 0.0750 0.0364],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''spec'')',... + 'Tag', 'K_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0140 0.7329 0.0240 0.0252],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'K =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text9'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0390 0.8462 0.2010 0.1077],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', 'SPECgraf(''signal'')',... + 'Tag', 'x_edit'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0130 0.9245 0.0240 0.0252],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'x =',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text4'... + ); +h=uicontrol; +x=version; +if (x(1)>='5'), + set(h, ... + 'FontSize', 10); +end; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0120 0.9636 0.1010 0.0238],... + 'BackGroundColor', [0.9255 0.9137 0.8471],... + 'String', 'Testing signal',... + 'Value', 0,... + 'Visible', 'on',... + 'Callback', '',... + 'Tag', 'text2'... + ); diff --git a/Ex2/matlab/design_task_2.m b/Ex2/matlab/design_task_2.m new file mode 100644 index 0000000..5b2306c --- /dev/null +++ b/Ex2/matlab/design_task_2.m @@ -0,0 +1,24 @@ +function h = design_task_2 + +% Design: interpolation filter +Fp_symb = 2000; +Fp_out = 8000; +L = Fp_out/Fp_symb + +N = 10*L+1; +% filter type: square root raised cosine (podniesiony spierwiastkowany kosinus) +h = 0.5* 1/L*rcos4(N, L, 0.33); + + +figure(12) +set(12, 'unit', 'normalized', 'position', [0.05, 0, 1-0.1, 2/3-0.1]) +freqz(h,1, 8*2048, L*Fp_symb) + +figure(11) +set(11, 'unit', 'normalized', 'position', [0.05, 2/3, 1-0.1, 1/3-0.1]) +plot(h) + +dane.h = L*h; +dane.Fp = Fp_symb; +save_filter_coef('ex2_task2', dane); + diff --git a/Ex2/matlab/design_tast_1.m b/Ex2/matlab/design_tast_1.m new file mode 100644 index 0000000..1304a8b --- /dev/null +++ b/Ex2/matlab/design_tast_1.m @@ -0,0 +1,26 @@ +function h=design_task_1 + +%interpolation filter +Fp1 = 22050; Fp2 = 44100; +L = 2; + +% passband ripple +/-0.1 dB, out of band attenuation -96dB +dp = 10.^(0.1/20)-1; +ds = 10.^(-96/20); + +c = firpmord( [10000 12000], [1 0], [dp ds], Fp2, 'cell'); +h = firpm(c{:}); +N= length(h) + +figure(1) +plot(h) +% pause + +figure(2) +freqz(h,1, 8*2048, L*Fp1) + + +dane.h = L*h; +dane.Fp = Fp1; +save_filter_coef('ex2_task1', dane); + diff --git a/Ex2/matlab/ex2_task1.coef b/Ex2/matlab/ex2_task1.coef new file mode 100644 index 0000000000000000000000000000000000000000..a213126f48934dd85187d0d087bd02b5e30836ed GIT binary patch literal 326 zcmZQzWMm9rSTRX>*G(q9-L{|C?N*gox_jb@*q!kj_11IlueK`gZrq)fAii7u-305% zWkuFfj~DKC__%fVXZiKk6^)EGGmdQ8edde7o^S8gS)bI)vN;_!bN36?>3bx1#ac_1 z?za*3Uc9T@{r#Q`znOQxjuElF+kM}<;e`2Kg@ws`%G*<I&qkfJnY?<^-qV%ZdtZ4S zwN;%q-8MZ@bl<-g`F+lp7TejKPOt}I5E~>0k^`v$sRii)=>?eqG7DrT$ZU`uAiF?z zg6syl0pu2tn?P;@xe?@6kefkn2l)Zy7m%MoegpXt<X4cNL4F5?0Vpg$VFC&pP#A&2 K3KV9bumb>k!K9`D literal 0 HcmV?d00001 diff --git a/Ex2/matlab/ex2_task2.coef b/Ex2/matlab/ex2_task2.coef new file mode 100644 index 0000000000000000000000000000000000000000..ae92edb74767e7d2a76083c2b3500f3273ae6326 GIT binary patch literal 170 zcmZQzWMtH2*wSfd-F{tpcl7ULyNxqSci--Fus+iJ(puZx+S-hlaZjK@&YmarhjvFk zYPXT(5Vm!l`pRapLB^hQ%9HkfXF0OB@s#S`hNN4zmT7bBgd)G#t?c5q2hkutNE{>& mQU_8G(g)HHG6!TH$Xt;5AbUXef$Rm@4{`^{Js@|1+y?;P-Aw`j literal 0 HcmV?d00001 diff --git a/Ex2/matlab/perGUI.m b/Ex2/matlab/perGUI.m new file mode 100644 index 0000000..f40a00b --- /dev/null +++ b/Ex2/matlab/perGUI.m @@ -0,0 +1,892 @@ +function fig_h=perGUI(state) +if nargin == 0, state = 'on'; end; + +fig_h=figure('Visible', state); +set(fig_h, ... + 'Color', [1.0000 1.0000 1.0000],... + 'Name', 'Untitled',... + 'NumberTitle', 'off',... + 'Menu', 'none',... + 'Tag', 'figure1'... + ); +set(fig_h, ... + 'Units', 'Normalized',... + 'Position', [0.2391667 0.1807407 0.5420833 0.6392593]... + ); +h=axes; +set(h, ... + 'Units', 'Normalized',... + 'Position', [0.2905457 0.6030841 0.6951576 0.1515287],... + 'Color', [1.0000 1.0000 1.0000],... + 'XColor', [0.1500 0.1500 0.1500],... + 'YColor', [0.1500 0.1500 0.1500],... + 'FontSize', 10,... + 'Box', 'on',... + 'Tag', 'Signal_im_axes'... + ); +h=axes; +set(h, ... + 'Units', 'Normalized',... + 'Position', [0.2937740 0.0424280 0.6930054 0.5015599],... + 'Color', [1.0000 1.0000 1.0000],... + 'XColor', [0.1500 0.1500 0.1500],... + 'YColor', [0.1500 0.1500 0.1500],... + 'FontSize', 10,... + 'Box', 'on',... + 'Tag', 'per_axes'... + ); +h=axes; +set(h, ... + 'Units', 'Normalized',... + 'Position', [0.2926979 0.8182547 0.6919293 0.1469828],... + 'Color', [1.0000 1.0000 1.0000],... + 'XColor', [0.1500 0.1500 0.1500],... + 'YColor', [0.1500 0.1500 0.1500],... + 'FontSize', 10,... + 'Box', 'on',... + 'Tag', 'Signal_re_axes'... + ); +h=uicontrol; +set(h, ... + 'Style', 'frame',... + 'Units', 'Normalized',... + 'Position', [0.0021522 0.2697210 0.2582629 0.1136465],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'frame8'... + ); +h=uicontrol; +set(h, ... + 'Style', 'frame',... + 'Units', 'Normalized',... + 'Position', [0.0021522 0.0500045 0.2582629 0.2127462],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'frame7'... + ); +h=uicontrol; +set(h, ... + 'Style', 'frame',... + 'Units', 'Normalized',... + 'Position', [0.0032283 0.8834121 0.2582629 0.1075853],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'frame6'... + ); +h=uicontrol; +set(h, ... + 'Style', 'frame',... + 'Units', 'Normalized',... + 'Position', [0.0032283 0.6591497 0.2582629 0.2182013],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'frame2'... + ); +h=uicontrol; +set(h, ... + 'Style', 'frame',... + 'Units', 'Normalized',... + 'Position', [0.0032283 0.3924592 0.2582629 0.2560834],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'frame4'... + ); +h=uicontrol; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.1898540 0.8424102 0.0630284 0.0301275],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'Select dir',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 8,... + 'Callback', 'PERgraf(''select_dir'')',... + 'Tag', 'pushbutton7'... + ); +h=uicontrol; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.2926979 0.5500490 0.0538048 0.0348516],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'lock',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''lock'')',... + 'Tag', 'lock_checkbox'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1743274 0.0575809 0.0807071 0.0393975],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''Fs_changed'')',... + 'Tag', 'Fs_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1000769 0.0606115 0.0699462 0.0333363],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'Fs [Sa/s] =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text27'... + ); +h=uicontrol; +set(h, ... + 'Style', 'popupmenu',... + 'Units', 'Normalized',... + 'Position', [0.0086088 0.6106605 0.2475019 0.0318210],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', ['Raw periodograph' ,... + '|Modified periodograph',... + '|Bartlett periodograph',... + '|Welch periodograph',... + ],... + 'Value', 1,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 8,... + 'Callback', 'PERgraf(''per_type_change'')',... + 'Tag', 'per_type_popupmenu'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1431207 0.2818433 0.0699462 0.0409127],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', '2.0',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''actionA'', ''maxA_edit'')',... + 'Tag', 'maxA_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1108378 0.2879044 0.0322829 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'max:',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text26'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0365872 0.2803280 0.0699462 0.0409127],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', '0.0',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''actionA'', ''minA_edit'')',... + 'Tag', 'minA_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0075327 0.2879044 0.0258263 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'min:',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text25'... + ); +h=uicontrol; +set(h, ... + 'Style', 'radiobutton',... + 'Units', 'Normalized',... + 'Position', [0.2184473 0.3030573 0.0322829 0.0257599],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', '+',... + 'Value', 1,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 8,... + 'Callback', 'PERgraf(''actionA'', ''A_plus_radio'')',... + 'Tag', 'A_plus_radio'... + ); +h=uicontrol; +set(h, ... + 'Style', 'radiobutton',... + 'Units', 'Normalized',... + 'Position', [0.2184473 0.2772974 0.0322829 0.0257599],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'x',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 8,... + 'Callback', 'PERgraf(''actionA'', ''A_razy_radio'')',... + 'Tag', 'A_razy_radio'... + ); +h=uicontrol; +set(h, ... + 'Style', 'slider',... + 'Units', 'Normalized',... + 'Position', [0.1172944 0.3288172 0.0193697 0.0469739],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', '',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 8,... + 'Callback', 'PERgraf(''actionA'', ''A_slider'')',... + 'Tag', 'A_slider'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1818601 0.3333630 0.0699462 0.0409127],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', '0.1',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''actionA'', ''dA_edit'')',... + 'Tag', 'dA_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1506533 0.3424548 0.0269024 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'dA =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text24'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0376633 0.3333630 0.0699462 0.0409127],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', '1.0',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''actionA'', ''A_edit'')',... + 'Tag', 'A_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0107610 0.3409395 0.0258263 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'A =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text23'... + ); +h=uicontrol; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.0096849 0.0575809 0.0839354 0.0439433],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'PSD redraw',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 8,... + 'Callback', 'PERgraf(''signal'')',... + 'Tag', 'pushbutton6'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1312836 0.4500401 0.0301307 0.0318210],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', '[%]',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'O_unit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.0043044 0.0060611 0.0828593 0.0393975],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'Exit',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''Exit'');',... + 'Tag', 'pushbutton5'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1829362 0.0045459 0.0807071 0.0393975],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''per_ylim'')',... + 'Tag', 'dY_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1140661 0.0075764 0.0667179 0.0333363],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'left',... + 'String', 'dY [dB] =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text21'... + ); +h=uicontrol; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.9286703 0.5470185 0.0538048 0.0348516],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'dB',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''dB'')',... + 'Tag', 'dB_checkbox'... + ); +h=uicontrol; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.1000769 0.2257777 0.0419677 0.0303057],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'b',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''Color'')',... + 'Tag', 'b_checkbox'... + ); +h=uicontrol; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.0538048 0.2257777 0.0419677 0.0303057],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'g',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''Color'')',... + 'Tag', 'g_checkbox'... + ); +h=uicontrol; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.0107610 0.2257777 0.0419677 0.0303057],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'r',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''Color'')',... + 'Tag', 'r_checkbox'... + ); +h=uicontrol; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.0710223 0.8940191 0.0645657 0.0454586],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'Delete',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''delete'')',... + 'Tag', 'pushbutton4'... + ); +h=uicontrol; +set(h, ... + 'Style', 'pushbutton',... + 'Units', 'Normalized',... + 'Position', [0.0129131 0.8940191 0.0516526 0.0454586],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'New',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''new'')',... + 'Tag', 'pushbutton3'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0086088 0.1091006 0.2453497 0.0924325],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'Static Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 8,... + 'Callback', '',... + 'Tag', 'text20'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0075327 0.2015331 0.1786318 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'Periodogram parameters',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text19'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1678709 0.4879223 0.0807071 0.0393975],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''per'')',... + 'Tag', 'N_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1355880 0.4939834 0.0322829 0.0287904],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'N =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'N_label'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0398155 0.6636955 0.0774789 0.0409127],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''signal'')',... + 'Tag', 'L_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0075327 0.6636955 0.0312068 0.0287904],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'L =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text17'... + ); +h=uicontrol; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.1366641 0.5455032 0.1183705 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'detrend',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''per'')',... + 'Tag', 'detrend_checkbox'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0408916 0.4454943 0.0807071 0.0393975],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''per'')',... + 'Tag', 'O_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0096849 0.4454943 0.0301307 0.0318210],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'O =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'O_label'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0538048 0.4000357 0.2012298 0.0363669],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''per'')',... + 'Tag', 'w_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0118370 0.3985204 0.0430438 0.0318210],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'w[n] =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'w_label'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1775557 0.6652108 0.0774789 0.0393975],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''signal'')',... + 'Tag', 'Noise_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.1259032 0.6652108 0.0505765 0.0287904],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'Noise=',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text14'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0419677 0.4879223 0.0807071 0.0393975],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''per'')',... + 'Tag', 'M_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0096849 0.4939834 0.0322829 0.0287904],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'M =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'M_label'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.1441968 0.8940191 0.1108378 0.0424280],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''change_name'')',... + 'Tag', 'Name_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'popupmenu',... + 'Units', 'Normalized',... + 'Position', [0.0129131 0.9485694 0.2431975 0.0318210],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Popup Menu',... + 'Value', 1,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''Choose'')',... + 'Tag', 'choose_popupmenu'... + ); +h=uicontrol; +set(h, ... + 'Style', 'checkbox',... + 'Units', 'Normalized',... + 'Position', [0.1237510 0.8435689 0.066 0.0289687],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'center',... + 'String', 'real',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''signal'')',... + 'Tag', 'real_checkbox'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0086088 0.5803548 0.1581860 0.0287904],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'Peridograf parameters',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text10'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0408916 0.5394420 0.0807071 0.0393975],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''per'')',... + 'Tag', 'K_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0129131 0.5470185 0.0258263 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'K =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text9'... + ); +h=uicontrol; +set(h, ... + 'Style', 'edit',... + 'Units', 'Normalized',... + 'Position', [0.0398155 0.7091541 0.2152191 0.1272841],... + 'BackGroundColor', [1.0000 1.0000 1.0000],... + 'HorizontalAlignment', 'center',... + 'String', 'Edit Text',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', 'PERgraf(''signal'')',... + 'Tag', 'x_edit'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0118370 0.8046172 0.0258263 0.0272752],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'x =',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text4'... + ); +h=uicontrol; +set(h, ... + 'Style', 'text',... + 'Units', 'Normalized',... + 'Position', [0.0107610 0.8440146 0.1086856 0.0257599],... + 'BackGroundColor', [0.9400 0.9400 0.9400],... + 'HorizontalAlignment', 'left',... + 'String', 'Analysed signal',... + 'Value', 0,... + 'Visible', 'on',... + 'FontName', 'MS Sans Serif',... + 'Fontsize', 10,... + 'Callback', '',... + 'Tag', 'text2'... + ); diff --git a/Ex2/matlab/rcos4.m b/Ex2/matlab/rcos4.m new file mode 100644 index 0000000..233f780 --- /dev/null +++ b/Ex2/matlab/rcos4.m @@ -0,0 +1,51 @@ +function h_rc=rcos4(N,L, r) +%square root raised cosine + +fp=1000; + +if nargin==2, + r=0.5; +end + +n=(0:N-1)-(N-1)/2; +% t=n/fp; T=L/fp; + +% % L=pi*L; h_rc=sinc(pi*n/L).*cos(pi*r*n/L)./(L-4*(r.^2)*(n.^2)/L); +% h_rc=sinc(t/T).*cos(r*pi*t/T)./(1-4*(r.^2)*(t.^2)/T.^2); +h_rc=(1-r)*sinc((1-r)*n/L) + ... + r*( sinc(r*n/L+1/4).*cos(pi*(n/L+1/4)) + ... + sinc(r*n/L-1/4).*cos(pi*(n/L-1/4)) ); +% % h_rc= 4*r* ( cos((1+r)*pi*n/L) + sin((1-r)*pi*n/L)./(4*r*n/L)) ... +% % ./ (pi*sqrt(1/L)*(1-(4*r*n/L).^2)); +% +ind=~isfinite(h_rc); +h_rc(ind)=0; + +if nargout==0, + figure(1) + subplot(3,1,1) + stem(n/L,h_rc) + subplot(3,1,2) + n=-(N-1):(N-1); +% size(n) +% size(conv(h_rc,h_rc)) + stem(n/L,conv(h_rc,h_rc)) + subplot(3,1,3) + H=freqz(h_rc,1,2048, 'whole'); + H=abs(H(1:end/2)); + f=linspace(0,1000,length(H)); + plot(f,H) + + H=freqz(ones(1,L),1,2048, 'whole'); + H=abs(H(1:end/2)); + f=linspace(0,1000,length(H)); + hold on + plot(f,H,'k') + hold off + H=freqz(conv(h_rc,h_rc)/L,1,2048, 'whole'); + H=abs(H(1:end/2)); + f=linspace(0,1000,length(H)); + hold on + plot(f,H,'m') + hold off +end \ No newline at end of file diff --git a/Ex2/matlab/readaudiofile.m b/Ex2/matlab/readaudiofile.m new file mode 100644 index 0000000..825a9a8 --- /dev/null +++ b/Ex2/matlab/readaudiofile.m @@ -0,0 +1,215 @@ +function [x, Fs] = readaudiofile(filename, param) +% [x, Fs] = readaudiofile(filename, param) +% +% returns vector x of the size SIZE=[samples channels]. +% eg. x = x(:,1) + j*x(:,2); +% +% special uses: +% param == 'size': returns SIZE in x +% param == 'cplx': for stereo files returns x as a complex vector instead of matrix +% +% supported file types: +% *.flt +% *.wav +% *.tape +% last modification: 2021.03.29 +% Author: Marek Blok + +return_cplx = 0; +if nargin == 1, + param = inf; +else + if strcmp(param, 'cplx') == 1, + return_cplx = 1; + param = inf; + end +end + +ind = find(filename == '.'); +if length(ind) == 0, + file_type = 'w'; % *.wav +else + ind = ind(end); + + temp = filename(ind+1:end); + + file_type = 'u'; % unknown format + if strcmp(temp, 'flt') == 1, + file_type = 'f'; % two channel floting point + elseif strcmp(temp, 'wav') == 1, + file_type = 'w'; % *.wav + elseif strcmp(temp, 'tape') == 1, + file_type = 't'; % *.tape + end +end + +switch file_type, + case 'w', + if strcmp(param, 'size') == 1, + if exist('audioread','file') == 0 + x = wavread(filename, 'size'); + % siz = [samples channels]. + else + info = audioinfo(filename); + x = [info.TotalSamples, info.NumChannels]; + Fs = info.SampleRate; + end + else + if isfinite(param) + if exist('audioread','file') == 0 + [x, Fs] = wavread(filename, param); + else + if length(param) == 1 + param = [1, param]; + end + [x, Fs] = audioread(filename, param); + end + else + if exist('audioread','file') == 0 + [x, Fs] = wavread(filename); + else + [x, Fs] = audioread(filename); + end + end + end + + case 't' + plik = fopen(filename, 'rb'); + if plik == -1, + error('File does not exist !!!'); + end + + header.size = fread(plik, 1, 'uint32', 0) + 4; + + header.fname = char(fread(plik, 256, 'char', 0).'); + header.cfg_fname = char(fread(plik, 256, 'char', 0).'); + header.sw_rev = fread(plik, 1, 'uint32', 0); + header.hw_rev = fread(plik, 1, 'uint32', 0); + header.file_ = fread(plik, 1, 'uint32', 0); + header.tape_type = fread(plik, 1, 'uint32', 0); + header.start_time = fread(plik, 1, 'int32', 0); % time_t + header.end_time = fread(plik, 1, 'int32', 0); % time_t + + header.total_samples = fread(plik, 1, 'uint32', 0); + file_length = header.total_samples * 4 + header.size + header.current_sample = fread(plik, 1, 'uint32', 0); + header.loop_start = fread(plik, 1, 'int64', 0); + header.loop_end = fread(plik, 1, 'int64', 0); + header.loop = fread(plik, 1, 'int32', 0); + header.group_size_32 = fread(plik, 1, 'uint32', 0); + header.block_size = fread(plik, 1, 'uint32', 0); + header.block_count = fread(plik, 1, 'uint32', 0); + header.fifo_size = fread(plik, 1, 'uint32', 0); + + + header.comment = char(fread(plik, 256, 'char', 0).'); + header.tmp = char(fread(plik, 20, 'char', 0).'); % time_t + header.status = fread(plik, 1, 'uint32', 0); + header.timestamps = fread(plik, 1, 'int32', 0); + header.freq = fread(plik, 1, 'float', 0); + header.cplx_datarate = fread(plik, 1, 'float', 0); + +% ftell(plik) + header.reserved = fread(plik, 128, 'uint32', 0); +% header.reserved.' + + header + ftell(plik) + + header.sample_type = 2; + header.ch_no = 2; + header.Fs = NaN; + + sample_type = 'int16'; + sample_size = 2; + + header_size = header.size; + if strcmp(param, 'size') == 1, + fseek(plik, 0, 'eof'); + size = (ftell(plik) - header_size) / sample_size / header.ch_no; % sizeof(float) *2 + x = size; + else + fseek(plik, header_size, 'bof'); + + len = param(1); + if length(param) > 1, + fseek(plik, sample_size*header.ch_no*(param(1)-1), 'cof'); + len = param(2) - param(1) + 1; + end + +% x = fread(plik, [header.ch_no, len], sample_type); + x = fread(plik, [header.ch_no, len], sample_type, 0); + x = x.'; + end + fclose(plik); + + case 'f' + plik = fopen(filename, 'rb'); + if plik == -1, + error('File does not exist !!!'); + end + + % 3 B - wersja pliku (w tym typ próbek) + % 1 B - liczba kanałów + % 4 B - szybkoć próbkowania + header_size = 8; + header.ver = fread(plik, 1, 'uint8'); + header.sample_type = fread(plik, 1, 'uint16'); + header.ch_no = fread(plik, 1, 'uint8'); + header.Fs = fread(plik, 1, 'uint32'); + + Fs = header.Fs; + + switch (header.ver), + case 0, + switch (header.sample_type), + case 0, + sample_type = 'float'; + sample_size = 4; + case 1, + sample_type = 'uchar'; + sample_size = 1; + case 2, + sample_type = 'short'; + sample_size = 2; + case 3, + sample_type = 'int'; + sample_size = 4; + otherwise + error('Unsupported *.flt sample type !!!'); + end + otherwise + error('Unsupported *.flt file version !!!'); + end + + + if strcmp(param, 'size') == 1, + fseek(plik, 0, 'eof'); + size = (ftell(plik) - header_size) / sample_size / header.ch_no; % sizeof(float) *2 + x = size; + else + len = param(1); + status = 0; + if length(param) > 1, + status = fseek(plik, sample_size*header.ch_no*(param(1)-1), 'cof'); + len = param(2) - param(1) + 1; + end + + if (status == -1) + x = []; + else + x = fread(plik, [header.ch_no, len], sample_type); + x = x.'; + end + end + + fclose(plik); + otherwise + error('Unsupported file format !!!'); +end + +if return_cplx == 1, + if length(x(1,:)) == 2, + x = x(:,1) + j*x(:,2); + end +end \ No newline at end of file diff --git a/Ex2/matlab/readme.txt b/Ex2/matlab/readme.txt new file mode 100644 index 0000000..34a4e99 --- /dev/null +++ b/Ex2/matlab/readme.txt @@ -0,0 +1 @@ +audioread('../cw1_zad3.wav') \ No newline at end of file diff --git a/Ex2/matlab/save_filter_coef.m b/Ex2/matlab/save_filter_coef.m new file mode 100644 index 0000000..8cf1f07 --- /dev/null +++ b/Ex2/matlab/save_filter_coef.m @@ -0,0 +1,226 @@ +function save_filter_coef(filename, coefficients, file_version) +% save_filter_coef(filename, coefficients [, file_version]) +% +% FIR filter coefficients +% coefficients.h +% - can be cell vector to store multiple FIR impulse responces +% - if any of the impulse responses is complex then all responses will +% be stored as complex +% IIR filter coefficients +% coefficients.a +% coefficients.b +% +% For file_version >= 1 (default == 0), +% coefficients.Fp - sampling frequency +% +% This file is a part of Digital Signal Processing Engine +% +% File format (*.coef) - this is open format, for general use +% * (not only for storing coefficients) +% +% File format (*.h) - this is C++ header file for DSPElib with hardcoded *.coef equivalent +% +% \author Marek Blok +% \date 2020.02.22 + +if nargin == 2, + file_version = 0; +end + +ind = find(filename == '.'); +if length(ind) == 0, + filename = [filename, '.coef']; +end + +% detect mode based on file extention +[PATHSTR,NAME,EXT] = fileparts(filename); +switch EXT + case '.h' + mode = 'h-file'; + plik = fopen(filename, 'wt'); + + case '.coef' + mode = 'coefs-file'; + plik = fopen(filename, 'wb'); + + otherwise + mode = 'unknown-file'; + error(mode); +end + +switch mode + case 'h-file' + fprintf(plik, '// save_filter_coef output (hard coded coefficients)\n'); + fprintf(plik, '#pragma once\n'); + fprintf(plik, '#include <DSP_lib.h>\n'); + fprintf(plik, '\n'); + + if isfield(coefficients, 'h'), + h = coefficients.h; + + for ind_h = 0:length(h)-1 + fprintf(plik, 'DSP_float_vector Farrow_coefs_row_%i = {', ind_h); + h_tmp = h{ind_h+1}; + for ind_p = 0:length(h_tmp)-1, + if ind_p > 0 + fprintf(plik, ', '); + end + fprintf(plik, '%.15ff', h_tmp(ind_p+1)); + end + %0.1f, 0.2f, 0.1f + fprintf(plik, '};\n'); + end + fprintf(plik, '\n'); + + %vector <DSP_float_vector> Farrow_coefs = { coefs_0, coefs_1, coefs_2 }; + fprintf(plik, 'vector <DSP_float_vector> Farrow_coefs = {'); + for ind_h = 0:length(h)-1 + if ind_h > 0 + fprintf(plik, ', '); + end + if (ind_h < length(h_tmp)) & (rem(ind_h, 5) == 0) + fprintf(plik, '\n '); + end + fprintf(plik, 'Farrow_coefs_row_%i', ind_h); + end + fprintf(plik, '\n };\n'); + + fprintf(plik, '\n'); + fprintf(plik, 'const unsigned int p_Farrow = %i; // should be equal to Farrow_coefs[0].size()-1\n', length(h{1})-1); + fprintf(plik, 'const unsigned int N_FSD = %i; // should be equal to Farrow_coefs.size()\n', length(h)); + end + + if isfield(coefficients, 'b'), + fclose all; + error('unsupported: coefficients.b'); + end + if isfield(coefficients, 'a'), + fclose all; + error('unsupported: coefficients.a'); + end + + case 'coefs-file' + % * - (uchar) 1B - file version number + fwrite(plik, file_version, 'uchar'); + + switch file_version, + case 0, + case 1, + % * - (uint) 4B - Sampling frequency + if isfield(coefficients, 'Fp'), + fwrite(plik, coefficients.Fp, 'uint32'); + else + fclose(plik); + error('Input data does not contain Fp'); + end + otherwise, + fclose(plik); + error('This version of coefficients file is unsupported'); + end + + if isfield(coefficients, 'h'), + isFIR = 1; + if iscell(coefficients.h) + resp_no = length(coefficients.h); + % if resp_no = 1; + % coefficients.h = coefficients.h{1}; + % end + else + resp_no = 1; + end + if resp_no == 1, + isComplex = any(imag(coefficients.h(:))); + else + isComplex = false; + for ind_resp = 1:resp_no, + isComplex = isComplex | any(imag(coefficients.h{ind_resp}(:))); + end + end + else + isFIR = 0; + isComplex = any(imag(coefficients.a(:))) | any(imag(coefficients.b(:))); + end + + % * - data - coefficients data (depends on fle version) + % * . + % * Data segment format: + % * -# (version: 0x00) + % * - (uchar) 1B - number of sample dimensions + % * 1 - real, 2 - complex, ... + if isComplex, + fwrite(plik, 2, 'uchar'); % complex + else + fwrite(plik, 1, 'uchar'); % real + end + % * - (uchar) 1B - sample component type + % * - DSP_FT_float (=1) : C++ float (32bit floating point) + % * - DSP_FT_short (=2) : C++ short (16bit signed integer) + % * - DSP_FT_uchar (=3) : C++ unsigned char (8bit unsigned integer with bias (0x80)) + % * - DSP_FT_double (=7) : C++ double (64bit floating point) + % * - DSP_FT_long_double (=8) : C++ long double (80bit floating point) + fwrite(plik, 1, 'uchar'); + + % * - (uchar) 1B - number of vectors + % * - 1 - FIR filter coefficients (one vector) + % * - 2 - IIR filter coefficients (two vectors) + % * - (x number of vectors) + % * - (ushort) 2B - number of samples in vector + % * - (x number of samples) + % * - (x number of sample dimensions) + % * - (sample componet type) xB - sample component + % * e.g. real, imag part + if isFIR, + fwrite(plik, resp_no, 'uchar'); + + if iscell(coefficients.h) + for ind_resp = 1:resp_no, + N_FIR = length(coefficients.h{ind_resp}); + fwrite(plik, N_FIR, 'uint16'); + if isComplex, + dane(1:2:2*N_FIR) = real(coefficients.h{ind_resp}); + dane(2:2:2*N_FIR) = imag(coefficients.h{ind_resp}); + fwrite(plik, dane, 'float'); + else + fwrite(plik, real(coefficients.h{ind_resp}), 'float'); + end + end + else + N_FIR = length(coefficients.h); + fwrite(plik, N_FIR, 'uint16'); + if isComplex, + dane(1:2:2*N_FIR) = real(coefficients.h); + dane(2:2:2*N_FIR) = imag(coefficients.h); + fwrite(plik, dane, 'float'); + else + fwrite(plik, real(coefficients.h), 'float'); + end + end + + else + fwrite(plik, 2, 'uchar'); + + N_a = length(coefficients.a); + fwrite(plik, N_a, 'uint16'); + if isComplex, + dane(1:2:2*N_a) = real(coefficients.a); + dane(2:2:2*N_a) = imag(coefficients.a); + fwrite(plik, dane, 'float'); + else + fwrite(plik, real(coefficients.a), 'float'); + end + + + N_b = length(coefficients.b); + fwrite(plik, N_b, 'uint16'); + if isComplex, + dane(1:2:2*N_b) = real(coefficients.b); + dane(2:2:2*N_b) = imag(coefficients.b); + fwrite(plik, dane, 'float'); + else + fwrite(plik, real(coefficients.b), 'float'); + end + end + +end +fclose(plik); + diff --git a/Ex2/rundot.bat b/Ex2/rundot.bat new file mode 100644 index 0000000..937cfc7 --- /dev/null +++ b/Ex2/rundot.bat @@ -0,0 +1,5 @@ +path = "D:\Program Files (x86)\Graphviz\bin";%path% + +del Ex2_task1.gif +dot -Tgif Ex2_task1.dot -oEx2_task1.gif + -- GitLab