From adf9e6f06d33b9bf91db8c7d1eaaa49192a0f0c7 Mon Sep 17 00:00:00 2001 From: Dsplib Date: Wed, 8 Jul 2020 23:28:59 +0300 Subject: [PATCH] Changes to be committed: deleted: dspl/doc/en/latex/Makefile modified: dspl/dox/doxyfile_en modified: dspl/dox/doxyfile_ru modified: dspl/dox/en/fft.dox modified: dspl/dox/en/filter_an.dox modified: dspl/dox/en/filter_ap.dox modified: dspl/dox/en/filter_fir.dox modified: dspl/dox/en/filter_ft.dox modified: dspl/dox/en/filter_iir.dox modified: dspl/dox/en/fourier_series.dox modified: dspl/src/dspl_internal.h modified: dspl/src/fft.c modified: dspl/src/fft_subkernel.c modified: examples/Makefile modified: examples/src/array_test.c modified: examples/src/bessel_i0.c modified: examples/src/butter_ap_test.c modified: examples/src/cheby1_ap_test.c modified: examples/src/cheby2_ap_test.c modified: examples/src/dft_test.c modified: examples/src/ellip_ap_test.c modified: examples/src/fft_cmplx_test.c modified: examples/src/fft_test.c modified: examples/src/idft_cmplx_test.c modified: examples/src/ifft_cmplx_test.c --- dspl/doc/en/latex/Makefile | 23 -- dspl/dox/doxyfile_en | 111 ++++--- dspl/dox/doxyfile_ru | 107 ++++--- dspl/dox/en/fft.dox | 305 +++++++++---------- dspl/dox/en/filter_an.dox | 251 +++++++--------- dspl/dox/en/filter_ap.dox | 534 +++++++++++++++------------------ dspl/dox/en/filter_fir.dox | 119 ++++---- dspl/dox/en/filter_ft.dox | 177 +++++------ dspl/dox/en/filter_iir.dox | 158 +++++----- dspl/dox/en/fourier_series.dox | 104 +++---- dspl/src/dspl_internal.h | 7 +- dspl/src/fft.c | 8 +- dspl/src/fft_subkernel.c | 95 ++++++ examples/Makefile | 4 +- examples/src/array_test.c | 16 +- examples/src/bessel_i0.c | 2 +- examples/src/butter_ap_test.c | 35 ++- examples/src/cheby1_ap_test.c | 28 +- examples/src/cheby2_ap_test.c | 32 +- examples/src/dft_test.c | 17 +- examples/src/ellip_ap_test.c | 30 +- examples/src/fft_cmplx_test.c | 29 +- examples/src/fft_test.c | 30 +- examples/src/idft_cmplx_test.c | 17 +- examples/src/ifft_cmplx_test.c | 39 +-- 25 files changed, 1130 insertions(+), 1148 deletions(-) delete mode 100644 dspl/doc/en/latex/Makefile diff --git a/dspl/doc/en/latex/Makefile b/dspl/doc/en/latex/Makefile deleted file mode 100644 index 877c9cc..0000000 --- a/dspl/doc/en/latex/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -LATEX_CMD=pdflatex - -all: refman.pdf - -pdf: refman.pdf - -refman.pdf: clean refman.tex - $(LATEX_CMD) refman - makeindex refman.idx - $(LATEX_CMD) refman - latex_count=8 ; \ - while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ - do \ - echo "Rerunning latex...." ;\ - $(LATEX_CMD) refman ;\ - latex_count=`expr $$latex_count - 1` ;\ - done - makeindex refman.idx - $(LATEX_CMD) refman - - -clean: - rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf diff --git a/dspl/dox/doxyfile_en b/dspl/dox/doxyfile_en index 7551b62..df3f345 100644 --- a/dspl/dox/doxyfile_en +++ b/dspl/dox/doxyfile_en @@ -1,4 +1,4 @@ -# Doxyfile 1.8.15 +# Doxyfile 1.8.18 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -197,6 +197,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -253,12 +263,6 @@ TAB_SIZE = 2 ALIASES = -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all @@ -299,14 +303,14 @@ OPTIMIZE_OUTPUT_SLICE = NO # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is -# Fortran), use: inc=Fortran f=C. +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # @@ -329,7 +333,7 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 @@ -465,6 +469,12 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -519,8 +529,8 @@ HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. +# declarations. If set to NO, these declarations will be included in the +# documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO @@ -543,7 +553,7 @@ INTERNAL_DOCS = NO # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. +# (including Cygwin) ands Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = NO @@ -839,8 +849,10 @@ INPUT_ENCODING = UTF-8 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen +# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -1285,9 +1297,9 @@ HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that -# are dynamically created via Javascript. If disabled, the navigation index will +# are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have Javascript, +# page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1300,7 +1312,7 @@ HTML_DYNAMIC_MENUS = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_DYNAMIC_SECTIONS = NO +HTML_DYNAMIC_SECTIONS = YES # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand @@ -1438,7 +1450,7 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1446,7 +1458,7 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- +# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1455,7 +1467,7 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1463,7 +1475,7 @@ QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1471,7 +1483,7 @@ QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = @@ -1512,7 +1524,7 @@ ECLIPSE_DOC_ID = org.doxygen.Project # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -DISABLE_INDEX = YES +DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag @@ -1555,6 +1567,17 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png The default and svg Looks nicer but requires the +# pdf2svg tool. +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1575,8 +1598,14 @@ FORMULA_FONTSIZE = 14 FORMULA_TRANSPARENT = YES +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side Javascript for the rendering +# https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path @@ -1584,7 +1613,7 @@ FORMULA_TRANSPARENT = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -USE_MATHJAX = NO +USE_MATHJAX = YES # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: @@ -1604,7 +1633,7 @@ MATHJAX_FORMAT = HTML-CSS # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest @@ -1646,7 +1675,7 @@ MATHJAX_CODEFILE = SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There +# implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH # setting. When disabled, doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing @@ -1750,10 +1779,11 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex # The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to -# generate index for LaTeX. +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. # Note: This tag is used in the generated output file (.tex). # See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. -# The default value is: \makeindex. +# The default value is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_MAKEINDEX_CMD = \makeindex @@ -2247,12 +2277,6 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- @@ -2266,15 +2290,6 @@ PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = NO -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. diff --git a/dspl/dox/doxyfile_ru b/dspl/dox/doxyfile_ru index f18f9fa..dcd9214 100644 --- a/dspl/dox/doxyfile_ru +++ b/dspl/dox/doxyfile_ru @@ -1,4 +1,4 @@ -# Doxyfile 1.8.15 +# Doxyfile 1.8.18 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -197,6 +197,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -253,12 +263,6 @@ TAB_SIZE = 2 ALIASES = -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all @@ -299,14 +303,14 @@ OPTIMIZE_OUTPUT_SLICE = NO # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is -# Fortran), use: inc=Fortran f=C. +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # @@ -329,7 +333,7 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 @@ -465,6 +469,12 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -519,8 +529,8 @@ HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. +# declarations. If set to NO, these declarations will be included in the +# documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO @@ -543,7 +553,7 @@ INTERNAL_DOCS = NO # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. +# (including Cygwin) ands Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = NO @@ -839,8 +849,10 @@ INPUT_ENCODING = UTF-8 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen +# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -1285,9 +1297,9 @@ HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that -# are dynamically created via Javascript. If disabled, the navigation index will +# are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have Javascript, +# page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1438,7 +1450,7 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1446,7 +1458,7 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- +# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1455,7 +1467,7 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1463,7 +1475,7 @@ QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1471,7 +1483,7 @@ QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = @@ -1555,6 +1567,17 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png The default and svg Looks nicer but requires the +# pdf2svg tool. +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1575,8 +1598,14 @@ FORMULA_FONTSIZE = 14 FORMULA_TRANSPARENT = YES +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side Javascript for the rendering +# https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path @@ -1584,7 +1613,7 @@ FORMULA_TRANSPARENT = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -USE_MATHJAX = NO +USE_MATHJAX = YES # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: @@ -1604,7 +1633,7 @@ MATHJAX_FORMAT = HTML-CSS # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest @@ -1646,7 +1675,7 @@ MATHJAX_CODEFILE = SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There +# implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH # setting. When disabled, doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing @@ -1750,10 +1779,11 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex # The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to -# generate index for LaTeX. +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. # Note: This tag is used in the generated output file (.tex). # See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. -# The default value is: \makeindex. +# The default value is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_MAKEINDEX_CMD = \makeindex @@ -2247,12 +2277,6 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- @@ -2266,15 +2290,6 @@ PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = NO -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. diff --git a/dspl/dox/en/fft.dox b/dspl/dox/en/fft.dox index 330c0d3..1ecefb9 100644 --- a/dspl/dox/en/fft.dox +++ b/dspl/dox/en/fft.dox @@ -8,13 +8,15 @@ \struct fft_t \brief Fast Fourier Transform Object Data Structure -The structure stores pointers to twiddle factors and arrays of intermediate data of the fast Fourier transform algorithm. +The structure stores pointers to twiddle factors and arrays of intermediate +data of the fast Fourier transform algorithm. The DSPL library uses an FFT algorithm for composite size. \param n -The size of the FFT vector for which memory is allocated in the structure arrays. \n +The size of the FFT vector for which memory is allocated +in the structure arrays. \n The parameter `n` must be equal to an integer power of two (radix 2). \n \n @@ -39,8 +41,9 @@ The structure is populated with the \ref fft_create function once before using the FFT algorithm. \n A pointer to an object of this structure may be reused when calling FFT functions. \n -Before exiting the program, dedicated memory for twiddle factors and arrays of intermediate data -must be cleared by the \ref fft_free function. For example: +Before exiting the program, dedicated memory for twiddle factors and arrays of +intermediate data must be cleared by the \ref fft_free function. +For example: \code fft_t pfft = {0}; /* Structure fft_t and clear all fields */ int n = 64; /* FFT size */ @@ -59,9 +62,10 @@ fft_free(&pfft); \endcode \note -It is important to note that if the object `fft_t` was created for the FFT size equal to` n`, -it can only be used for FFT of size `n`. \n \n -It’s also worth noting that the FFT functions independently control the size, and independently allocate the memory of the FFT object, if necessary. +It is important to note that if the object `fft_t` was created for the FFT size +equal to` n`, it can only be used for FFT of size `n`. \n \n +It’s also worth noting that the FFT functions independently control the size, +and independently allocate the memory of the FFT object, if necessary. So if you call any function using the `fft_t` structure with filled data for the FFT length `k` for calculating the FFT of length`n`, then the structure arrays will be automatically recreated for the length `n`. @@ -81,52 +85,53 @@ then the structure arrays will be automatically recreated for the length `n`. /*! **************************************************************************** \ingroup DFT_GROUP \fn int ifft_cmplx(complex_t* x, int n, fft_t* pfft, complex_t* y) -\brief Обратное быстрое преобразование Фурье +\brief Inverse fast Fourier transform -Функция рассчитывает \f$ n \f$-точечное обратное быстрое преобразование Фурье -от \f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$. \n +Function calculates \f$ n \f$-point IFFT of complex data +\f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$. \n \f[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \f] -где \f$ k = 0 \ldots n-1 \f$. +here \f$ k = 0 \ldots n-1 \f$. -Для расчета используется алгоритм БПФ составной длины. \param[in] x -Указатель на входной комплексный вектор \f$x(m)\f$, +Pointer to the input vector \f$x(m)\f$, \f$ m = 0 \ldots n-1 \f$. \n -Размер вектора `[n x 1]`. \n \n +Vector size is `[n x 1]`. \n \n \param[in] n -Размер ОБПФ \f$n\f$. \n -Размер ОБПФ может быть составным вида +IFFT size \f$n\f$. \n +IFFT size can be composite: \f$n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m\f$, -где \f$n_i = 2,3,5,7\f$, а \f$m \f$ -- -произвольный простой множитель не превосходящий 46340 -(см. описание функции \ref fft_create). \n \n +here \f$n_i = 2,3,5,7\f$, а \f$m \f$ -- +simple number less than 46340 +(see \ref fft_create function). \n \n \param[in] pfft -Указатель на структуру `fft_t`. \n -Указатель не должен быть `NULL`. \n -Структура \ref fft_t должна быть предварительно однократно -заполнена функцией \ref fft_create, и память должна быть -очищена перед выходом функцией \ref fft_free. \n \n +Pointer to the `fft_t` object. \n +This pointer cannot be `NULL`. \n +Structure \ref fft_t should be previously once +filled with the \ref fft_create function, and the memory should be +cleared before exiting by the \ref fft_free function. \n \n \param[out] y -Указатель на вектор результата ОБПФ \f$Y(k)\f$, -\f$ k = 0 \ldots n-1 \f$. Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n \n +Pointer to the IFFT result vector \f$Y(k)\f$, +\f$ k = 0 \ldots n-1 \f$. \n +Vector size is `[n x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` если расчет произведен успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n \n +`RES_OK` if IFFT is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -Пример использования функции `fft`: + +IFFT example: \include ifft_cmplx_test.c -Результат работы программы: +Result: \verbatim | x[ 0] = 1.000 0.000 | y[ 0] = -0.517 0.686 | z[ 0] = 1.000 0.000 | @@ -149,9 +154,7 @@ then the structure arrays will be automatically recreated for the length `n`. | x[17] = -0.275 -0.961 | y[17] = -0.300 0.588 | z[17] = -0.275 -0.961 | \endverbatim -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -160,53 +163,53 @@ www.dsplib.org /*! **************************************************************************** \ingroup DFT_GROUP \fn int fft(double* x, int n, fft_t* pfft, complex_t* y) -\brief Быстрое преобразование Фурье вещественного сигнала +\brief Fast Fourier transform for the real vector. -Функция рассчитывает \f$ n \f$-точечное быстрое преобразование Фурье -вещественного сигнала \f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$. \n +Function calculated \f$ n \f$-points FFT for the real vector +\f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$. \n \f[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \f] -где \f$ k = 0 \ldots n-1 \f$. +here \f$ k = 0 \ldots n-1 \f$. -Для расчета используется алгоритм БПФ составной длины. \param[in] x -Указатель на вектор вещественного входного сигнала \f$x(m)\f$, +Pointer to the input real vector \f$x(m)\f$, \f$ m = 0 \ldots n-1 \f$. \n -Размер вектора `[n x 1]`. \n \n +Vector size is `[n x 1]`. \n \n \param[in] n -Размер БПФ \f$n\f$. \n -Размер БПФ может быть составным вида +FFT size \f$n\f$. \n +FFT size can be composite: \f$n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m\f$, -где \f$n_i = 2,3,5,7\f$, а \f$m \f$ -- -произвольный простой множитель не превосходящий 46340 -(см. описание функции \ref fft_create). \n \n +here \f$n_i = 2,3,5,7\f$, а \f$m \f$ -- +simple number less than 46340 +(see \ref fft_create function). \n \n \param[in] pfft -Указатель на структуру `fft_t`. \n -Указатель не должен быть `NULL`. \n -Структура \ref fft_t должна быть предварительно однократно -заполнена функцией \ref fft_create, и память должна быть -очищена перед выходом функцией \ref fft_free. \n \n +Pointer to the `fft_t` object. \n +This pointer cannot be `NULL`. \n +Structure \ref fft_t should be previously once +filled with the \ref fft_create function, and the memory should be +cleared before exiting by the \ref fft_free function. \n \n \param[out] y -Указатель на комплексный вектор результата БПФ \f$Y(k)\f$, +Pointer to the FFT result complex vector \f$Y(k)\f$, \f$ k = 0 \ldots n-1 \f$. \n -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n \n +Vector size is `[n x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` если расчет произведен успешно. \n - В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n \n +`RES_OK` if FFT is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -Пример использования функции `fft`: + +Example: \include fft_test.c -Результат работы программы: +Result: \verbatim y[ 0] = 91.000 0.000 @@ -225,9 +228,7 @@ y[12] = -7.000 -14.536 y[13] = -7.000 -30.669 \endverbatim -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -238,54 +239,52 @@ www.dsplib.org /*! **************************************************************************** \ingroup DFT_GROUP \fn int fft_cmplx(complex_t* x, int n, fft_t* pfft, complex_t* y) -\brief Быстрое преобразование Фурье комплексного сигнала +\brief Fast Fourier transform for the complex vector. -Функция рассчитывает \f$ n \f$-точечное быстрое преобразование Фурье -комплексного сигнала \f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$. \n +Function calculated \f$ n \f$-points FFT for the complex vector +\f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$. \n \f[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp - \left( -j \frac{2\pi}{n} m k \right), + \left( -j \frac{2\pi}{n} m k \right), \f] -где \f$ k = 0 \ldots n-1 \f$. - -Для расчета используется алгоритм БПФ составной длины. +here \f$ k = 0 \ldots n-1 \f$. \param[in] x -Указатель на вектор комплексного -входного сигнала \f$x(m)\f$, \f$ m = 0 \ldots n-1 \f$. \n -Размер вектора `[n x 1]`. \n \n +Pointer to the input complex vector \f$x(m)\f$, +\f$ m = 0 \ldots n-1 \f$. \n +Vector size is `[n x 1]`. \n \n \param[in] n -Размер БПФ \f$n\f$. \n -Размер БПФ может быть составным вида -\f$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m\f$, -где \f$n_i = 2,3,5,7\f$, а \f$m \f$ -- -произвольный простой множитель не превосходящий 46340 -(см. описание функции \ref fft_create). \n \n +FFT size \f$n\f$. \n +FFT size can be composite: +\f$n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m\f$, +here \f$n_i = 2,3,5,7\f$, а \f$m \f$ -- +simple number less than 46340 +(see \ref fft_create function). \n \n \param[in] pfft -Указатель на структуру `fft_t`. \n -Указатель не должен быть `NULL`. \n -Структура \ref fft_t должна быть предварительно однократно -заполнена функцией \ref fft_create, и память должна быть -очищена перед выходом функцией \ref fft_free. \n \n +Pointer to the `fft_t` object. \n +This pointer cannot be `NULL`. \n +Structure \ref fft_t should be previously once +filled with the \ref fft_create function, and the memory should be +cleared before exiting by the \ref fft_free function. \n \n \param[out] y -Указатель на комплексный вектор -результата БПФ \f$Y(k)\f$, -\f$ k = 0 \ldots n-1 \f$. -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n \n +Pointer to the FFT result complex vector \f$Y(k)\f$, +\f$ k = 0 \ldots n-1 \f$. \n +Vector size is `[n x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` если расчет произведен успешно. \n - В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n \n +`RES_OK` if FFT is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -Пример использования функции `fft`: + +Example: \include fft_cmplx_test.c -Результат работы программы: +Result: \verbatim y[ 0] = -0.517 0.686 @@ -308,9 +307,7 @@ y[16] = -0.161 0.525 y[17] = -0.300 0.588 \endverbatim -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -319,74 +316,64 @@ www.dsplib.org /*! **************************************************************************** \ingroup DFT_GROUP \fn int fft_create(fft_t* pfft, int n) -\brief Заполнение структуры `fft_t` для алгоритма БПФ +\brief Function creates and fill `fft_t` structure. -Функция производит выделение памяти и рассчет векторов -поворотных коэффициентов `n`-точечного БПФ для структуры `fft_t`. +The function allocates memory and calculates twiddle factors + of the `n`-point FFT for the structure` fft_t`. \param[in,out] pfft -Указатель на структуру `fft_t`. \n -Указатель не должен быть `NULL`. \n \n +Pointer to the `fft_t` object. \n +Pointer cannot be `NULL`. \n \n \param[in] n -Размер БПФ \f$n\f$. \n -Размер БПФ может быть составным вида +FFT size \f$n\f$. \n +FFT size can be composite \f$n = n_0 \times n_1 \times n_2 \ldots \times n_p \times m\f$, -где \f$n_i = 2,3,5,7\f$, а \f$m \f$ -- -произвольный простой множитель не превосходящий 46340. \n -Таким образом алгоритм БПФ поддерживает произвольные длины, равные целой -степени чисел 2,3,5,7, а также различные их комбинации. \n -Так например, при \f$ n = 725760 \f$ структура будет успешно заполнена, -потому что -\f$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 \f$, -т.е. получается как произведение множителей 2,3,5,7. \n -При \f$ n = 172804 = 43201 \cdot 4 \f$ структура также будет успешно заполнена, -потому что простой множитель входящий в \f$n\f$ не превосходит 46340. \n -Для размера \f$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 \f$ -функция вернет ошибку, поскольку 66079 больше 46340 и не является результатом -произведения чисел 2,3,5,7. \n \n +here \f$n_i = 2,3,5,7\f$, and \f$m \f$ -- + arbitrary prime factor not exceeding 46340. \n +Thus, the FFT algorithm supports arbitrary integer lengths. +degrees of numbers 2,3,5,7, as well as their various combinations. \n +For example, with \f$ n = 725760 \f$ the structure will be successfully filled, +because +\f$ 725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 \f$. \n +If \f$ n = 172804 = 43201 \cdot 4 \f$ then the structure will also be +successfully filled, because the simple factor in \f$ n \f$ does not +exceed 46340. \n +For size \f$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 \f$ +the function will return an error since 66079 is greater than 46340 and is +not the result of the product of numbers 2,3,5,7. \n \n \return -`RES_OK` если структура заполнена успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n \n +`RES_OK` if FFT structure is created and filled successfully. \n +Else \ref ERROR_CODE_GROUP "code error". \note -Некоторые компиляторы при создании структуры не обнуляют ее содержимое. -Поэтому рекомендуется произвести обнуление структуры после ее объявления: +Some compilers do not nullify its contents when creating a structure. +Therefore, it is recommended to reset the structure after its declaration: \code{.cpp} -fft_t pfft; /* объявляем объект fft_t */ -int n = 64; /* Размер БПФ */ - -/* -бнуляем все поля и указатели. -Данные шаг рекомендуется ввиду того, что некоторые -компиляторы при создании переменной не инициализируют ее нулем. -*/ - -memset(&pfft, 0, sizeof(fft_t)); +fft_t pfft = {0}; /* fill and fields of fft_t as zeros*/ +int n = 64; /* FFT size */ int err; -/* создаем объект для 64-точечного БПФ */ +/* Create fft_t object for 64-points FFT */ err = fft_create(&pfft, n); /* ................................... */ -/* очистить память объекта БПФ */ +/* Clear fft_t structure */ fft_free(&pfft); \endcode -Перед выходом из программы выделенную в структуре память -необходимо очистить функцией \ref fft_free . \n \n +Before exiting the program, the memory allocated in the structure +need to clear by \ref fft_free function. \n \n \note -Магия числа 46340 заключается в том, что \f$\sqrt{2^{31}} = 46340.95\f$. \n +The "magic number" 46340 because \f$\sqrt{2^{31}} = 46340.95\f$. \n -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -400,17 +387,15 @@ www.dsplib.org /*! **************************************************************************** \ingroup DFT_GROUP \fn void fft_free(fft_t *pfft) -\brief Очистить структуру `fft_t` алгоритма БПФ +\brief Free `fft_t` structure. -Функция производит очищение памяти промежуточных данных -и векторов поворотных коэффициентов структуры `fft_t`. +The function clears the intermediate data memory +and vectors of FFT twiddle factors of the structure `fft_t`. \param[in] pfft -Указатель на структуру `fft_t`. \n +Pointer to the `fft_t` object. \n -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -423,34 +408,28 @@ www.dsplib.org /*! **************************************************************************** \ingroup DFT_GROUP \fn int fft_shift(double* x, int n, double* y) -\brief Перестановка спектральных отсчетов дискретного преобразования Фурье - -Функция производит - -перестановку спектральных отсчетов ДПФ - и переносит нулевую частоту в центр вектора ДПФ. \n -Данная функция обрабатывает вещественные входные и выходные вектора -и может применяться для перестановки -амплитудного или фазового спектра. +\brief Perform a shift of the vector `x`, for use with the `fft` and `ifft` +functions, in order + + to move the frequency 0 to the center + of the vector `y`. \param[in] x -Указатель на исходный вектор ДПФ. \n -Размер вектора `[n x 1]`. \n \n +Pointer to the input vector (FFT or IFFT result). \n +Vector size is `[n x 1]`. \n \n \param[in] n -Размер ДПФ \f$n\f$ (размер векторов до и после перестановки). \n \n +Input and output vector size. \n \n \param[out] y -Указатель на вектор результата перестановки. \n -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n \n +Pointer to the output vector with frequency 0 in the center. \n +Vector size is `[n x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` если перестановка произведена успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if function is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ diff --git a/dspl/dox/en/filter_an.dox b/dspl/dox/en/filter_an.dox index 0f9e6eb..6e1ded5 100644 --- a/dspl/dox/en/filter_an.dox +++ b/dspl/dox/en/filter_an.dox @@ -2,65 +2,50 @@ /*! **************************************************************************** \ingroup FILTER_ANALYSIS_GROUP \fn int freqs(double* b, double* a, int ord, double* w, int n, complex_t *h) +\brief Analog filter frequency response \f$ H(j \omega) \f$ calculation -\brief Расчет комплексного коэффициента передачи -\f$ H(j \omega) \f$ аналогового фильтра. - -Функция рассчитывает значения комплексного коэффициента передачи -\f$ H(j \omega)\f$ аналогового фильтра, заданного коэффициентами -передаточной функции \f$ H(s) \f$: +Function calculates analog filter frequaency response \f$ H(j \omega)\f$ +corresponds to transfer function \f$ H(s) \f$: \f[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \f] -где \f$ N \f$ - порядок фильтра (параметр `ord`). - -Комплексный коэффициент передачи рассчитывается путем -подстановки \f$ s = j \omega \f$. +here \f$ N \f$ - filter order (equals to `ord`). \param[in] b -Указатель на вектор коэффициентов числителя -передаточной функции \f$ H(s) \f$. \n -Размер вектора `[ord+1 x 1]`. \n \n - +Pointer to the transfer function \f$ H(s) \f$ +numerator coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$ H(s) \f$. \n -Размер вектора `[ord+1 x 1]`. \n \n - +Pointer to the transfer function \f$ H(s) \f$ +denominator coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] ord -Порядок фильтра. Количество коэффициентов числителя и -знаменателя передаточной функции \f$ H(s) \f$ -равно `ord+1`. \n \n - +Filter order. \n +Transfer function \f$ H(s) \f$ numerator and denominator +coefficients number equals `ord+1`. \n \n \param[in] w -Указатель на вектор значений циклической частоты \f$ \omega \f$ (рад/с), -для которого будет рассчитан комплексный -коэффициент передачи \f$ H(j \omega) \f$. \n -Размер вектора `[n x 1]`. \n \n - +Pointer to the angular frequency \f$ \omega \f$ (rad/s), +which used for frequency response \f$ H(j \omega) \f$ calculation. \n +Vector size is `[n x 1]`. \n \n \param[in] n -Размер вектора циклической частоты `w`. \n \n - +The size of the angular frequency vector `w`. \n \n \param[out] h -Указатель на вектор комплексного коэффициента передачи \f$ H(j \omega) \f$, -рассчитанного для циклической частоты `w`. \n -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n \n +Pointer to the frequency response vector \f$ H(j \omega) \f$, +corresponds to angular frequency `w`. \n +Vector size is `[n x 1]`. \n +Memory must be allocated. \n \n -\return -`RES_OK` Комплексноый коэффициент передачи рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +\return `RES_OK` if frequency response vector is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -75,79 +60,74 @@ www.dsplib.org int flag, double* mag, double* phi, double* tau) \brief -Расчет амплитудно-частотной (АЧХ), фазочастотной характеристик (ФЧХ), а также -группового времени запаздывания (ГВЗ) цифрового или аналогового или фильтра. +Magnitude, phase response and group delay vectors calculation +for digital or analog filter corresponds to \f$H(s)\f$, or \f$H(z)\f$ +transfer function. -Функция рассчитывает АЧХ, ФЧХ и ГВЗ аналогового или цифрового фильтра, заданного -передаточной характеристикой \f$H(s)\f$, или \f$H(z)\f$ соответственно \param[in] b -Указатель на вектор коэффициентов числителя -передаточной функции \f$ H(s) \f$. \n -Размер вектора `[ord+1 x 1]`. \n \n +Pointer to the \f$ H(s) \f$ or \f$H(z)\f$ transfer function +numerator coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$ H(s) \f$. \n -Размер вектора `[ord+1 x 1]`. \n \n +Pointer to the \f$ H(s) \f$ or \f$H(z)\f$ transfer function +denominator coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] ord -Порядок фильтра. Количество коэффициентов -числителя и знаменателя передаточной -функции \f$ H(s) \f$ равно `ord+1`. \n \n +Filter order. \n +Transfer function \f$ H(s) \f$ or \f$H(z)\f$ numerator +and denominator coefficients number equals `ord+1`. \n \n \param[in] w -Указатель на вектор значений циклической частоты \f$ \omega \f$ (рад/с), -для которого будет рассчитаны АЧХ, ФЧХ и ГВЗ аналогового фильтра, -если установлен флаг `DSPL_FLAG_ANALOG`. \n -В случае если флаг `DSPL_FLAG_ANALOG` не установлен, то вектор частоты `w` -используется как нормированная частота комплексного коэффициента передачи -\f$ H \left(\mathrm{e}^{j\omega} \right) \f$ цифрового фильтра. \n -В этом случае характеристика цифрового фильтра является -\f$ 2\pi \f$-периодической, и вектор частоты может содержать -произвольные значения, однако целесообразно задавать -его от 0 до \f$ \pi \f$, а такжет от 0 до \f$ 2\pi \f$, или -от \f$ -\pi \f$ до \f$ \pi \f$. \n -Размер вектора `[n x 1]`. \n \n - +Pointer to the angular frequency \f$ \omega \f$ (rad/s), +which used for analog filter characteristics calculation +(flag sets as `DSPL_FLAG_ANALOG`). \n +For digital filter (flag sets as `DSPL_FLAG_DIGITAL`), + parameter `w` describes normalized frequency of +frequency response \f$ H \left(\mathrm{e}^{j\omega} \right) \f$. +Digital filter frequency response is \f$ 2\pi \f$-periodic function, +and vector `w` advisable to set from 0 to \f$ \pi \f$, +or from 0 to \f$ 2\pi \f$, or from \f$ -\pi \f$ to \f$ \pi \f$. +Vector size is `[n x 1]`. \n \n + \param[in] n -Размер вектора циклической частоты `w`. \n \n +Size of frequency vector `w`. \n \n \param[in] flag -Комбинация флагов, которые задают расчет параметров: \n +Binary flags to set calculation rules: \n \verbatim -DSPL_FLAG_ANALOG Коэффициенты относятся к аналоговому фильтру -DSPL_FLAG_LOGMAG АЧХ рассчитывать в логарифмическом масштабе -DSPL_FLAG_UNWRAP раскрывать периодичность ФЧХ +DSPL_FLAG_ANALOG Coefficients corresponds to analog filter +DSPL_FLAG_DIGITAL Coefficients corresponds to digital filter +DSPL_FLAG_LOGMAG Calculate magnitude in logarithmic scale (in dB) +DSPL_FLAG_UNWRAP Unwrap radian phases by adding multiples of 2*pi \endverbatim \param[out] mag -Указатель на вектор АЧХ. \n -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n -Если указатель `NULL`, то расчет АЧХ не производится. \n \n +Pointer to the filter magnitude vector. \n +Vector size is `[n x 1]`. \n +If pointer is `NULL`, then magnitude will not calculted. \n \n \param[out] phi -Указатель на вектор ФЧХ. \n -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n -Если указатель `NULL`, то расчет ФЧХ не производится. \n \n +Pointer to the phase response vector. \n +Vector size is `[n x 1]`. \n +If pointer is `NULL`, then phase response will not calculted. \n \n \param[out] tau -Указатель на вектор ГВЗ. \n -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n -Если указатель `NULL`, то расчет ГВЗ не производится. \n \n +Pointer to the group delay vector. \n +Vector size is `[n x 1]`. \n +If pointer is `NULL`, then group delay will not calculted. \n \n \return -`RES_OK` Параметры фильтра рассчитаны успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +\return `RES_OK` if function is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -Пример использования функции `filter_freq_resp`: +Example: \include butter_ap_test.c -Результат работы программы: +Result: \verbatim b[ 0] = 1.002 a[ 0] = 1.002 @@ -158,22 +138,19 @@ b[ 4] = 0.000 a[ 4] = 1.000 \endverbatim \n -В каталоге `dat` будут созданы три файла: \n +In `dat` folder will be created 3 files: \n \verbatim -butter_ap_test_mag.txt АЧХ фильтра -butter_ap_test_phi.txt ФЧХ фильтра -butter_ap_test_tau.txt ГВЗ фильтра +butter_ap_test_mag.txt magnitude +butter_ap_test_phi.txt phase response +butter_ap_test_tau.txt group delay \endverbatim -Кроме того программа GNUPLOT произведет построение следующих графиков -по сохраненным в файлах данным: +In addition, GNUPLOT will build the following graphs from data stored in files: \image html butter_ap_test.png -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -189,72 +166,56 @@ www.dsplib.org \ingroup FILTER_ANALYSIS_GROUP \fn int freqz(double* b, double* a, int ord, double* w, int n, complex_t *h) -\brief Расчет комплексного коэффициента передачи - \f$ H \left(e^{j \omega} \right)\f$ цифрового фильтра. - -Функция рассчитывает значения комплексного коэффициента передачи -\f$ H \left(e^{j \omega} \right)\f$ цифрового фильтра, заданного -коэффициентами передаточной функции \f$H(z)\f$: +\brief Function calculates the digital filter frequency response +\f$ H \left(e^{j \omega} \right)\f$ corresponds to transfer function \f$H(z)\f$. +Digital filter transfer function: \f[ -H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} - {\sum_{m = 0}^{N} a_m z^{-m}}, +H(z) = \frac{\sum\limits_{k = 0}^{N} b_k z^{-k}} + {\sum\limits_{m = 0}^{N} a_m z^{-m}}, \f] +here \f$N\f$ --- filter order (parameter `ord`). \n -где \f$N\f$ --- порядок фильтра (параметр `ord`). \n - -Комплексный коэффициент передачи рассчитывается путем -подстановки \f$z = e^{j \omega} \f$. \n +Frequency response \f$ H \left(e^{j \omega} \right)\f$ we can get +if substitude \f$z = e^{j \omega} \f$. \n \param[in] b -Указатель на вектор коэффициентов числителя -передаточной функции \f$H(z)\f$. \n -Размер вектора `[ord+1 x 1]`. \n \n +Pointer to the \f$ H(z) \f$ transfer function +numerator coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$H(z)\f$. \n -Размер вектора `[ord+1 x 1]`. \n \n - +Pointer to the \f$H(z)\f$ transfer function +denominator coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n + \param[in] ord -Порядок фильтра. Количество коэффициентов числителя и знаменателя -передаточной функции \f$H(z)\f$ равно `ord+1`. \n \n +Filter order. \n +Transfer function \f$H(z)\f$ numerator +and denominator coefficients number equals `ord+1`. \n \n \param[in] w -Указатель на вектор значений нормированной циклической частоты \f$\omega\f$, -для которого будет рассчитан комплексный коэффициент передачи -\f$ H \left(e^{j \omega} \right)\f$. \n -Размер вектора `[n x 1]`. \n \n +Pointer to the normalized frequency of digital filter +frequency response \f$ H \left(\mathrm{e}^{j\omega} \right) \f$. \n +Digital filter frequency response is \f$ 2\pi \f$-periodic function, +and vector `w` advisable to set from 0 to \f$ \pi \f$, +or from 0 to \f$ 2\pi \f$, or from \f$ -\pi \f$ to \f$ \pi \f$. +Vector size is `[n x 1]`. \n \n + \param[in] n -Размер вектора нормированной циклической частоты `w`. \n \n +Size of frequency vector `w`. \n \n \param[out] h -Указатель на вектор комплексного коэффициента передачи -\f$ H \left(e^{j \omega} \right)\f$, рассчитанного для -циклической частоты `w`. \n -Размер вектора `[n x 1]`. \n -Память должна быть выделена. \n \n +Pointer to the frequency response vector +\f$ H \left(\mathrm{e}^{j\omega} \right) \f$, +corresponds to normalized frequency `w`. \n +Vector size is `[n x 1]`. \n +Memory must be allocated. \n \n +\return `RES_OK` if frequaency response vector is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -\return -`RES_OK` Комплексный коэффициент передачи расcчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n - -\note -Комплексный коэффициент передачи \f$ H \left(e^{j \omega} \right)\f$ -цифрового фильтра представляет собой \f$ 2 \pi-\f$периодическую функцию -нормированной циклической частоты \f$\omega\f$. -Поэтому анализ цифровых фильтров целесообразно вести на одном периоде -повторения \f$ H \left(e^{j \omega} \right)\f$, т.е. в интервале -\f$\omega\f$ от 0 до \f$2 \pi\f$, или от \f$-\pi\f$ до \f$ \pi\f$. \n -Кроме того известно, что для фильтра с вещественными коэффициентами -\f$ H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)\f$, -а значит, анализ цифрового фильтра с вещественными коэффициентами -достаточно вести для нормированной частоты \f$\omega\f$ от 0 до \f$\pi\f$. - -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ diff --git a/dspl/dox/en/filter_ap.dox b/dspl/dox/en/filter_ap.dox index 7bc258e..fbbc9c9 100644 --- a/dspl/dox/en/filter_ap.dox +++ b/dspl/dox/en/filter_ap.dox @@ -8,75 +8,72 @@ \fn int butter_ap(double Rp, int ord, double* b, double* a) \brief -Расчет передаточной характеристики \f$ H(s) \f$ аналогового -нормированного ФНЧ Баттерворта. +Function calculates the transfer function \f$ H(s) \f$ coefficients of +analog normalized lowpass Butterworth filter. -Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$ -аналогового нормированного ФНЧ Баттерворта порядка `ord` с частотой среза -1 рад/с по уровню \f$ -R_p \f$ дБ. +Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB +for angular frequency \f$ \omega \f$ from 0 to 1 rad/s. \param[in] Rp -Неравномерность АЧХ в полосе пропускания (дБ). \n -Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n -Значение должно быть положительным. \n +Magnitude ripple in passband (dB). \n +This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n +Parameter must be positive. \n \n \param[in] ord -Порядок фильтра. \n -Количество коэффициентов числителя и знаменателя -передаточной функции \f$H(s)\f$ равно `ord+1`. \n +Filter order. \n +Filter coefficients number equals `ord+1` for numerator and denominator +of transfer function \f$ H(s) \f$ \n \n \param[out] b -Указатель на вектор коэффициентов числителя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +numerator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[out] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +denominator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- фильтр рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". \n -Пример использования функции `butter_ap`: +Example: \include butter_ap_test.c -Результат работы программы: +Result: \verbatim -b[ 0] = 1.965 a[ 0] = 1.965 -b[ 1] = 0.000 a[ 1] = 3.138 -b[ 2] = 0.000 a[ 2] = 2.505 -b[ 3] = 0.000 a[ 3] = 1.000 +b[ 0] = 1.002 a[ 0] = 1.002 +b[ 1] = 0.000 a[ 1] = 2.618 +b[ 2] = 0.000 a[ 2] = 3.418 +b[ 3] = 0.000 a[ 3] = 2.615 +b[ 4] = 0.000 a[ 4] = 1.000 \endverbatim \n -В каталоге `dat` будут созданы три файла: \n +In `dat` folder will be created 3 files: \n \verbatim -butter_ap_test_mag.txt АЧХ фильтра -butter_ap_test_phi.txt ФЧХ фильтра -butter_ap_test_tau.txt ГВЗ фильтра +butter_ap_test_mag.txt magnitude +butter_ap_test_phi.txt phase response +butter_ap_test_tau.txt group delay \endverbatim -Кроме того программа GNUPLOT произведет построение следующих графиков -по сохраненным в файлах данным: +In addition, GNUPLOT will build the following graphs from data stored in files: \image html butter_ap_test.png -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -92,67 +89,58 @@ www.dsplib.org complex_t* p, int* np) \brief -Расчет массивов нулей и полюсов передаточной функции -\f$ H(s) \f$ аналогового нормированного ФНЧ Баттерворта. +Function calculates arrays of zeros and poles for analog normlized lowpass +Batterworth filter transfer function \f$ H(s) \f$ order `ord` . -Функция рассчитывает значения нулей и полюсов передаточной функции -\f$ H(s)\f$ аналогового нормированного ФНЧ Баттерворта порядка `ord` -с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ. \n +Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB +for angular frequency \f$ \omega \f$ from 0 to 1 rad/s. \param[in] ord -Порядок фильтра. \n +Filter order. \n +Number of zeros and poles of filter can be less or equal `ord`. \n \n \param[in] rp -Неравномерность АЧХ в полосе пропускания (дБ). \n -Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n -Значение должно быть положительным. \n +Magnitude ripple in passband (dB). \n +This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n +Parameter must be positive. \n \n \param[out] z -Указатель на массив комплексных нулей -передаточной характеристики \f$ H(s)\f$. \n -Максимальный размер вектора вектора `[ord x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$ H(s) \f$ zeros array. \n +Maximum vector size is `[ord x 1]`. \n +Memory must be allocated for maximum vector size. \n \n \param[out] nz -Указатель на переменную количества нулей -передаточной характеристики \f$ H(s)\f$. \n -По данному указателю будет записано количество -нулей фильтра, которые были рассчитаны и -помещены в вектор `z`. \n -Память должна быть выделена. \n +Pointer to the variable which keep number of finite zeros \f$ H(s) \f$. \n +Number of finite zeros which was calculated and saved in vector `z`. \n +Pointer cannot be `NULL`. \n \n \param[out] p -Указатель на массив комплексных полюсов -передаточной характеристики \f$ H(s)\f$. \n -Максимальный размер вектора вектора `[ord x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$ H(s) \f$ poles array. \n +Maximum vector size is `[ord x 1]`. \n +Memory must be allocated for maximum vector size. \n \n \param[out] np -Указатель на переменную количества полюсов -передаточной характеристики \f$ H(s)\f$. \n -По данному укащзателю будет записано количество нулей фильтра, которые -были рассчитны и помещены в вектор `p`. \n -Память должна быть выделена. \n +Pointer to the variable which keep number of +calculated poles of \f$ H(s) \f$. \n +Pointer cannot be `NULL`. \n \n \return -`RES_OK` --- массивы нулей и полюсов рассчитаны успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if zeros and poles is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". \n \note -Нормированный ФНЧ Баттерворта не имеет нулей, поэтому массив нулей `z` -не будет изменен, а по указателю `nz` будет записан 0. \n +Normalized Butterworth lowpass filter has no finite zeros. +So `z` vector will not changed and in pointer `nz` will write 0 value. \n -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -167,51 +155,48 @@ www.dsplib.org \fn int cheby1_ap(double Rp, int ord, double* b, double* a) \brief -Расчет передаточной характеристики \f$ H(s) \f$ аналогового -нормированного ФНЧ Чебышёва первого рода. +Function calculates the transfer function \f$ H(s) \f$ coefficients of +analog normalized lowpass Chebyshev type 1 filter. -Функция рассчитывает коэффициенты передаточной характеристики -\f$ H(s)\f$ аналогового нормированного ФНЧ Чебышёва первого рода -порядка `ord` с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ. \n - -Особенностью фильтра Чебышёва первого рода являются -равноволновые пульсации АЧХ в полосе пропускания. +Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB +for angular frequency \f$ \omega \f$ from 0 to 1 rad/s. \param[in] Rp -Неравномерность АЧХ в полосе пропускания (дБ). \n -Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n -Значение должно быть положительным. \n +Magnitude ripple in passband (dB). \n +This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n +Parameter must be positive. \n \n \param[in] ord -Порядок фильтра. \n -Количество коэффициентов числителя и знаменателя -передаточной функции \f$ H(s)\f$ равно `ord+1`. \n +Filter order. \n +Filter coefficients number equals `ord+1` for numerator and denominator +of transfer function \f$ H(s) \f$ \n \n \param[out] b -Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +numerator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[out] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +denominator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- фильтр рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". \n -Пример использования функции `cheby1_ap`: +Example: \include cheby1_ap_test.c -Результат работы программы: +Result: \verbatim b[ 0] = 0.125 a[ 0] = 0.177 @@ -222,23 +207,19 @@ b[ 4] = 0.000 a[ 4] = 1.000 \endverbatim \n -В каталоге `dat` будут созданы три файла: \n +In `dat` folder will be created 3 files: \n \verbatim -cheby1_ap_test_mag.txt АЧХ фильтра -cheby1_ap_test_phi.txt ФЧХ фильтра -cheby1_ap_test_tau.txt ГВЗ фильтра +cheby1_ap_test_mag.txt magnitude +cheby1_ap_test_phi.txt phase response +cheby1_ap_test_tau.txt group delay \endverbatim -\n -Кроме того программа GNUPLOT произведет построение следующих графиков -по сохраненным в файлах данным: +In addition, GNUPLOT will build the following graphs from data stored in files: \image html cheby1_ap_test.png -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -253,64 +234,58 @@ www.dsplib.org \fn int cheby1_ap_zp( int ord, double rp, complex_t *z, int* nz, complex_t* p, int* np) \brief -Расчет массивов нулей и полюсов передаточной функции \f$ H(s) \f$ -аналогового нормированного ФНЧ Чебышёва первого рода. +Function calculates arrays of zeros and poles for analog normlized lowpass +Chebyshev type 1 filter transfer function \f$ H(s) \f$ order `ord` . + +Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB +for angular frequency \f$ \omega \f$ from 0 to 1 rad/s. -Функция рассчитывает значения нулей и полюсов передаточной функции -\f$ H(s)\f$ аналогового нормированного ФНЧ Чебышёва первого рода -порядка `ord` с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ, с -неравномерностью в полосе пропускания \f$ R_p \f$ дБ. \n \param[in] ord -Порядок фильтра. \n +Filter order. \n +Number of zeros and poles of filter can be less or equal `ord`. \n \n \param[in] rp -Неравномерность АЧХ в полосе пропускания (дБ). \n -Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n -Значение должно быть положительным. \n +Magnitude ripple in passband (dB). \n +This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n +Parameter must be positive. \n \n \param[out] z -Указатель на массив комплексных нулей -передаточной характеристики \f$ H(s)\f$. \n -Максимальный размер вектора вектора `[ord x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$ H(s) \f$ zeros array. \n +Maximum vector size is `[ord x 1]`. \n +Memory must be allocated for maximum vector size. \n \n \param[out] nz -Указатель на переменную количества нулей -передаточной функции \f$H(s)\f$. \n -По данному указателю будет записано количество нулей фильтра, -которые были рассчитаны и помещены в вектор `z`. \n -Память должна быть выделена. \n +Pointer to the variable which keep number of finite zeros \f$ H(s) \f$. \n +Number of finite zeros which was calculated and saved in vector `z`. \n +Pointer cannot be `NULL`. \n \n \param[out] p -Указатель на массив комплексных полюсов -передаточной характеристики \f$H(s)\f$. \n -Максимальный размер вектора вектора `[ord x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$ H(s) \f$ poles array. \n +Maximum vector size is `[ord x 1]`. \n +Memory must be allocated for maximum vector size. \n \n \param[out] np -Указатель на переменную количества полюсов передаточной функции \f$ H(s)\f$. \n -По данному укащзателю будет записано количество нулей фильтра, которые были -рассчитны и помещены в вектор `p`. \n -Память должна быть выделена. \n +Pointer to the variable which keep number of +calculated poles of \f$ H(s) \f$. \n +Pointer cannot be `NULL`. \n \n \return -`RES_OK` --- массивы нулей и полюсов рассчитаны успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if zeros and poles is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". +\n \note -Нормированный ФНЧ Чебышёва первого рода не имеет нулей, поэтому массив -нулей `z` не будет изменен, а по указателю `nz` будет записан 0. \n +Normalized Chebyshev type 1 lowpass filter has no finite zeros. +So `z` vector will not changed and in pointer `nz` will write 0 value. \n -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -323,47 +298,50 @@ www.dsplib.org \fn int cheby2_ap(double Rs, int ord, double *b, double *a) \brief -Расчет передаточной характеристики \f$ H(s) \f$ аналогового -нормированного ФНЧ Чебышёва второго рода. +Function calculates the transfer function \f$ H(s) \f$ coefficients of +analog normalized lowpass Chebyshev type 2 filter. -Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$ -аналогового нормированного ФНЧ Чебышёва второго рода порядка `ord` -с частотой заграждения 1 рад/с по уровню \f$-R_s\f$ дБ. \n - -Особенностью фильтра Чебышёва второго рода являются: \n -1) равноволновые пульсации АЧХ в полосе заграждения. \n -2) уровень АЧХ \f$H(j\cdot 1) = -R_s\f$ дБ. \n +Analog normalized Chebyshev type 2 filter lowpass filter has \f$Rs\f$ dB +suppression in stopband. +Also analog normalized Chebyshev type 2 filter magnitude equals \f$-Rs\f$ dB +for angular frequency \f$\omega = 1\f$ rad/s. \param[in] Rs -Уровень подавления в полосе пропускания (дБ). \n -Значение должно быть положительным. \n +Suppression level in stopband (dB). \n +This parameter sets filter supression for \f$\omega \geq 1\f$ rad/s frequency. \n +Parameter must be positive. \n \n \param[in] ord -Порядок фильтра. \n -Количество коэффициентов числителя и знаменателя -передаточной функции \f$H(s)\f$ равно `ord+1`. \n +Filter order. \n +Filter coefficients number equals `ord+1` for numerator and denominator +of transfer function \f$ H(s) \f$ \n \n \param[out] b -Указатель на вектор коэффициентов числителя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +numerator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[out] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +denominator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n -Пример использования функции `cheby1_ap`: +\return +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". +\n + +Example: \include cheby2_ap_test.c -Результат работы программы: +Result: \verbatim b[ 0] = 0.008 a[ 0] = 0.008 @@ -374,28 +352,19 @@ b[ 4] = 0.001 a[ 4] = 1.000 \endverbatim \n -В каталоге `dat` будут созданы три файла: \n +In `dat` folder will be created 3 files: \n \verbatim -cheby2_ap_test_mag.txt АЧХ фильтра -cheby2_ap_test_phi.txt ФЧХ фильтра -cheby2_ap_test_tau.txt ГВЗ фильтра +cheby2_ap_test_mag.txt magnitude +cheby2_ap_test_phi.txt phase response +cheby2_ap_test_tau.txt group delay \endverbatim -\n -Кроме того программа GNUPLOT произведет построение следующих графиков -по сохраненным в файлах данным: +In addition, GNUPLOT will build the following graphs from data stored in files: \image html cheby2_ap_test.png - -\return -`RES_OK` --- фильтр рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n - -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -408,60 +377,60 @@ www.dsplib.org complex_t* p, int* np) \brief -Расчет массивов нулей и полюсов передаточной функции \f$ H(s) \f$ -аналогового нормированного ФНЧ Чебышёва второго рода. +Function calculates arrays of zeros and poles for analog normlized lowpass +Chebyshev type 2 filter transfer function \f$ H(s) \f$ order `ord` . -Функция рассчитывает значения нулей и полюсов передаточной функции -\f$H(s)\f$ аналогового нормированного ФНЧ Чебышёва второго рода порядка `ord` с -частотой заграждения 1 рад/с по уровню \f$-R_s\f$ дБ. \n +Analog normalized Chebyshev type 2 filter lowpass filter has \f$Rs\f$ dB +suppression in stopband. +Also analog normalized Chebyshev type 2 filter magnitude equals \f$-Rs\f$ dB +for angular frequency \f$\omega = 1\f$ rad/s. \param[in] ord -Порядок фильтра. \n +Filter order. \n +Number of zeros and poles of filter can be less or equal `ord`. \n \n \param[in] rs -Уровень подавления АЧХ в полосе загражения (дБ). \n -Параметр задает уровень подавления сигнала в полосе частот от 1 рад/с и выше. \n -Значение должно быть положительным. \n +Suppression level in stopband (dB). \n +This parameter sets filter supression for \f$\omega \geq 1\f$ rad/s frequency. \n +Parameter must be positive. \n \n \param[out] z -Указатель на массив комплексных нулей передаточной функции \f$H(s)\f$. \n -Максимальный размер вектора вектора `[ord x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$ H(s) \f$ zeros array. \n +Maximum vector size is `[ord x 1]`. \n +Memory must be allocated for maximum vector size. \n \n \param[out] nz -Указатель на переменную количества нулей передаточной функции \f$H(s)\f$. \n -По данному указателю будет записано количество нулей фильтра, которые были -рассчитаны и помещены в вектор `z`. \n -Память должна быть выделена. \n +Pointer to the variable which keep number of finite zeros \f$ H(s) \f$. \n +Number of finite zeros which was calculated and saved in vector `z`. \n +Pointer cannot be `NULL`. \n \n \param[out] p -Указатель на массив комплексных полюсов передаточной функции \f$H(s)\f$. \n -Максимальный размер вектора вектора `[ord x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$ H(s) \f$ poles array. \n +Maximum vector size is `[ord x 1]`. \n +Memory must be allocated for maximum vector size. \n \n \param[out] np -Указатель на переменную количества полюсов передаточной функции \f$H(s)\f$. \n -По данному указателю будет записано количество нулей -фильтра, которые были -рассчитаны и помещены в вектор `p`. \n -Память должна быть выделена. \n +Pointer to the variable which keep number of +calculated poles of \f$ H(s) \f$. \n +Pointer cannot be `NULL`. \n \n \return -`RES_OK` --- массивы нулей и полюсов рассчитаны успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if zeros and poles is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". +\n -Пример использования функции `cheby2_ap_zp`: +Example: \include cheby2_ap_zp_test.c -Результат работы программы: +Result: \verbatim Chebyshev type 2 zeros: @@ -482,9 +451,7 @@ www.dsplib.org p[ 6] = -0.852 -0.642 j \endverbatim -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -496,52 +463,53 @@ www.dsplib.org \fn int ellip_ap(double rp, double rs, int ord, double* b, double* a) \brief -Расчет передаточной характеристики \f$ H(s) \f$ аналогового -нормированного эллиптического ФНЧ. - -Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$ -аналогового нормированного эллиптического ФНЧ порядка `ord` -с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ. \n - -Особенностью эллиптического фильтра являются равноволновые пульсации -АЧХ как в полосе пропускания, так и в полосе заграждения, в результате -чего обеспечиваеся минимальная переходная полоса фильтра. \n +Function calculates the transfer function \f$ H(s) \f$ coefficients of +analog normalized lowpass elliptic filter order `ord` with passband ripple +`rp` dB and stopband suppression equals `rs` dB. \param[in] rp -Уровень пульсаций в полосе пропускания (дБ). \n -Значение должно быть положительным. \n +Magnitude ripple in passband (dB). \n +This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n +Parameter must be positive. \n \n -\param[in] Rs -Уровень подавления в полосе заграждения (дБ). \n -Значение должно быть положительным. \n + +\param[in] rs +Suppression level in stopband (dB). \n +This parameter sets filter supression for \f$\omega \geq 1\f$ rad/s frequency. \n +Parameter must be positive. \n \n \param[in] ord -Порядок фильтра. \n -Количество коэффициентов числителя и знаменателя -передаточной функции \f$H(s)\f$ равно `ord+1`. \n +Filter order. \n +Filter coefficients number equals `ord+1` for numerator and denominator +of transfer function \f$ H(s) \f$ \n \n \param[out] b -Указатель на вектор коэффициентов числителя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +numerator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[out] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +denominator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n -Пример использования функции `ellip_ap`: +\return +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". +\n + +Example: \include ellip_ap_test.c -Результат работы программы: +Result: \verbatim b[ 0] = 0.268 a[ 0] = 0.301 @@ -552,28 +520,19 @@ b[ 4] = 0.001 a[ 4] = 1.000 \endverbatim \n -В каталоге `dat` будут созданы три файла: \n +In `dat` folder will be created 3 files: \n \verbatim -ellip_ap_test_mag.txt АЧХ фильтра -ellip_ap_test_phi.txt ФЧХ фильтра -ellip_ap_test_tau.txt ГВЗ фильтра +ellip_ap_test_mag.txt magnitude +ellip_ap_test_phi.txt phase response +ellip_ap_test_tau.txt group delay \endverbatim -\n -Кроме того программа GNUPLOT произведет построение следующих графиков -по сохраненным в файлах данным: +In addition, GNUPLOT will build the following graphs from data stored in files: \image html ellip_ap_test.png - -\return -`RES_OK` --- фильтр рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n - -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -589,67 +548,68 @@ www.dsplib.org \ingroup IIR_FILTER_DESIGN_GROUP \fn int filter_zp2ab(complex_t *z, int nz, complex_t *p, int np, int ord, double* b, double* a) -\brief Функция пересчета нулей и полюсов аналогового фильтра в коэффициенты - передаточной характеристики \f$ H(s) \f$ - +\brief +Function recalculates complex zeros and poles of transfer function \f$ H(s) \f$ +to the coefficients of \f$ H(s) \f$ numerator and denominator polynomials. + +Transfer function can we described as: \f[ H(s) = -\frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} = -\frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)} +\frac{\sum\limits_{n = 0}^{N_z} b_n s^n}{\sum\limits_{m = 0}^{N_p} a_m s^m} = +\frac{\prod\limits_{n = 0}^{N_z}(s-z_n)}{\prod\limits_{m = 0}^{N_p} (s-p_m)} \f] \param[in] z -Указатель на массив нулей передаточной характеристики. \n -Размер вектора `[nz x 1]`. \n -Указатель может быть `NULL` если фильтр не имеет конечных нулей (`nz=0`). \n +Pointer to the vector of transfer function zeros. \n +Vector size is `[nz x 1]`. \n +Pointer can be `NULL` if filter has no finite zeros (`nz=0`). \n \n \param[in] nz -Размер вектора нулей передаточной характеристики (может быть равен 0). \n +Number of fitite zeros (can be zero). \n \n \param[in] p -Указатель на массив полюсов передаточной характеристики. \n -Размер вектора `[np x 1]`. \n -Указатель не может быть `NULL`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function poles. \n +Vector size is `[np x 1]`. \n +This pointer cannot be `NULL`. \n \n \param[in] np -Размер вектора полюсов передаточной характеристики (не может быть равен 0). \n +Size of vector of transfer function poles (`p` vector size). \n \n \param[in] ord -Порядок фильтра для которого рассчитаны нули и полюса. \n -Количество коэффициентов числителя и знаменателя -передаточной функции \f$H(s)\f$ равно `ord+1`. \n \n +Filter order. \n +Number of \f$H(s)\f$ numerator and denominator coefficients equals `ord+1`. \n +\n \param[out] b -Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +numerator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[out] a -Указатель на вектор коэффициентов знаменателя -передаточной функции \f$H(s)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of transfer function \f$H(s)\f$ +denominator coefficient. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- пересчет произведен успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". +\n \note -Функция возвращает вещественные значения коэффициентов `b` и `a` -передаточной функции. Это означает, что вектора нулей и полюсов -должны хранить вещественные значения или комплексно-сопряженные пары -нулей и полюсов, потому что мнимая часть коэффициентов `b` и `a` -игнорируется и не сохраняется. +Function calculates real `b` and `a` coefficients of \f$H(s)\f$. +It means that zeros and poles vectors must have real values or conjugate pairs +to get zeros image part of `b` and `a` coefficients. This function ignores +image part of `b` and `a` coeeffitients if the requirements for zeros +and poles are not fulfilled. -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ diff --git a/dspl/dox/en/filter_fir.dox b/dspl/dox/en/filter_fir.dox index 8252223..70e8fbd 100644 --- a/dspl/dox/en/filter_fir.dox +++ b/dspl/dox/en/filter_fir.dox @@ -3,130 +3,121 @@ /*! **************************************************************************** \ingroup FIR_FILTER_DESIGN_GROUP \fn int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type, - int win_type, double win_param, double* h) +int win_type, double win_param, double* h) \brief -Расчет коэффициентов линейно-фазового КИХ-фильтра -методом оконного взвешивания. +Function calculates linear-phase FIR filter coefficients by window method -Функция рассчитывает коэффициенты передаточной характеристики +FIR filter transfer function is \f[ -H(z) = \sum_{n = 0}^{ord} h_n z^{-n} +H(z) = \sum_{n = 0}^{ord} h_n z^{-n}. \f] -цифрового линейно-фазового КИХ-фильтра фильтра. \param[in] ord -Порядок фильтра (количество элементов задержки). \n -Количество коэффициентов фильтра равно `ord+1`. \n +Filter order. \n +Number of FIR filter coefficients is `ord+1`. \n \n \param[in] w0 -Нормированная частота среза ФНЧ или ФВЧ, -или левая частота среза для полосового и режекторного фильтра. \n +Normalized cutoff frequency for lowpass and highpass filter, +or left cutoff frequency for bandpass or bandstop filter. \n \n \param[in] w1 -Правая частота среза полосового и режекторного фильтра. \n -Данный параметр игнорируется для ФНЧ и ФВЧ. \n -Частота `w1` должна быть больше `w0`. \n +Right normalized cutoff frequency for bandpass or bandstop filter. \n +This parameter is ignored for lowpass or highpass filters. \n +Frequecny `w1` must be higher than `w0`. \n \n \param[in] filter_type -Тип фильтра. \n -Данный параметр определяет тип фильтра -и может принимать одно из значений: \n +Filter type. \n +This parameter can be one of follow: \n \verbatim -DSPL_FILTER_LPF - фильтр нижних частот; -DSPL_FILTER_HPF - фильтр верхних частот; -DSPL_FILTER_BPASS - полосовой фильтр; -DSPL_FILTER_BSTOP - режекторный фильтр. +DSPL_FILTER_LPF - lowpass filter; +DSPL_FILTER_HPF - highpass filter; +DSPL_FILTER_BPASS - bandpass filter; +DSPL_FILTER_BSTOP - bandstop filter. \endverbatim \n \n \param [in] win_type -Тип оконной функции. \n -Может принимать одно из следующих значений: \n +Window function type. \n +This parameter can be one of follow: \n \verbatim ------------------------------------------------------------------------- -Значение win_type | Описание + win_type | Description -----------------------------|------------------------------------------- - DSPL_WIN_BARTLETT | Непараметрическое окно Бартлетта + DSPL_WIN_BARTLETT | Nonparametric Bartlett window -----------------------------|------------------------------------------- - DSPL_WIN_BARTLETT_HANN | Непараметрическое окно Бартлетта-Ханна + DSPL_WIN_BARTLETT_HANN | Nonparametric Bartlett-Hann window -----------------------------|------------------------------------------- - DSPL_WIN_BLACKMAN | Непараметрическое окно Блэкмана + DSPL_WIN_BLACKMAN | Nonparametric Blackman window -----------------------------|------------------------------------------- - DSPL_WIN_BLACKMAN_HARRIS | Непараметрическое окно Блэкмана-Харриса + DSPL_WIN_BLACKMAN_HARRIS | Nonparametric Blackman-Harris window -----------------------------|------------------------------------------- - DSPL_WIN_BLACKMAN_NUTTALL | Непараметрическое окно Блэкмана-Натталла + DSPL_WIN_BLACKMAN_NUTTALL | Nonparametric Blackman-Nuttall -----------------------------|------------------------------------------- - DSPL_WIN_CHEBY | Параметрическое окно Дольф-Чебышева. - | Параметр win_param задает уровень - | боковых лепестков в дБ. + DSPL_WIN_CHEBY | Parametric Dolph-Chebyshev window. + | Parametr `win_param` sets sidelobe attenuation + | level in dB. -----------------------------|------------------------------------------- - DSPL_WIN_COS | Непараметрическое косинус-окно + DSPL_WIN_COS | Nonparametric Cosine window -----------------------------|------------------------------------------- - DSPL_WIN_FLAT_TOP | Непараметрическое окно с максимально - | плоской вершиной + DSPL_WIN_FLAT_TOP | Nonparametric maxflat window -----------------------------|------------------------------------------- - DSPL_WIN_GAUSSIAN | Параметрическое окно Гаусса + DSPL_WIN_GAUSSIAN | Nonparametric Gauss window -----------------------------|------------------------------------------- - DSPL_WIN_HAMMING | Непараметрическое окно Хемминга + DSPL_WIN_HAMMING | Nonparametric Hamming window -----------------------------|------------------------------------------- - DSPL_WIN_HANN | Непараметрическое окно Ханна + DSPL_WIN_HANN | Nonparametric Hann window -----------------------------|------------------------------------------- - DSPL_WIN_KAISER | Параметрическое окно Кайзера + DSPL_WIN_KAISER | Parametric Kaiser window -----------------------------|------------------------------------------- - DSPL_WIN_LANCZOS | Непараметрическое окно Ланкзоса + DSPL_WIN_LANCZOS | Nonparametric Lanczos window -----------------------------|------------------------------------------- - DSPL_WIN_NUTTALL | Непараметрическое окно Натталла + DSPL_WIN_NUTTALL | Nonparametric Nuttall window -----------------------------|------------------------------------------- - DSPL_WIN_RECT | Непараметрическое прямоугольное окно + DSPL_WIN_RECT | Nonparametric rectangular window ------------------------------------------------------------------------- \endverbatim \n \n \param [in] win_param -Параметр окна. \n -Данный параметр применяется только для параметрических оконных функций. \n -Для непараметрических окон игнорируется. \n +Parameter value for parametric windows. \n +This parameter is used for parametric windows only and is ignored for +nonparametric windows. \n \n \param[out] h -Указатель на вектор коэффициентов линейно-фазового КИХ-фильтраю \f$H(z)\f$. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the linear-phase FIR filter coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n +Memoru must be allocated. \n \n \note -Для соблюдения условия линейной ФЧХ используются -только симметричные окна. \n \n -Расчет режекторного линейно-фазового КИХ-фильтра -(если `filter_type = DSPL_FILTER_BSTOP`) производится только -для фильтров чётного порядка `ord`. -В случае нечетного порядка `ord` функция вернет код ошибки `ERROR_FILTER_ORD`. +Only symmetric windows can achieve linear-phase FIR filter. \n \n +Bandstop filter type (`filter_type = DSPL_FILTER_BSTOP`) requires +only even filter order `ord`. +If `filter_type = DSPL_FILTER_BSTOP` and `ord` is odd then function +returns `ERROR_FILTER_ORD` code. \n \return -`RES_OK` -Фильтр рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -Пример использования функции: +Example: \include fir_linphase_test.c -Программа расчитывает коэффициенты и АЧХ линейно-фазовых КИХ-фильтрова нижних, -верхних частот, полосовых и режекторных с применением различных весовых окон: -прямоугольное, Хемминга, Илэкмана и Блэкмана-Харриса. \n -Полученные АЧХ выводятся на график +This function calculates coeffictiens of lowpass, highpass, bandpass + and bandstop linear-phase FIR filters by using different kind of windows. + Also program calculates filter magnitudes and plots. \n \image html fir_linphase_test.png -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ diff --git a/dspl/dox/en/filter_ft.dox b/dspl/dox/en/filter_ft.dox index d310af7..460d363 100644 --- a/dspl/dox/en/filter_ft.dox +++ b/dspl/dox/en/filter_ft.dox @@ -2,62 +2,57 @@ \ingroup IIR_FILTER_DESIGN_GROUP \fn int low2high (double* b, double* a, int ord, double w0, double w1, double* beta, double* alpha) -\brief Частотное преобразование ФНЧ-ФВЧ +\brief Lowpass to highpass filter frequency transform -Функция производит перобразование передаточной функции \f$ H(s) \f$ -аналогового ФНЧ с частотой среза `w0` рад/c -в передаточную функцию \f$ F(s) \f$ аналоговго ФВЧ с частотой среза `w1` рад/c. +Function transforms lowpass filter transfer function \f$ H(s) \f$ +to the highpass filter transfer function \f$ F(s) \f$. -Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе -заграждения и порядок фильтра остаются неизменными. +Filter order, magnitude ripple in passband and stopband +supression still the same. \param[in] b -Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$ -исходного аналогового ФНЧ. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the lowpass filter transfer function \f$H(s)\f$ numerator +coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] a -Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$ -исходного аналогового ФНЧ. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the lowpass filter transfer function \f$H(s)\f$ denominator +coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] ord -Порядок исходного фильтра и фильтра после переобразования. \n +Filter order. \n \n \param[in] w0 -Частота среза исходного ФНЧ. \n +Lowpass filter cutoff frequency. \n \n \param[in] w1 -Требуемая частота среза ФВЧ после преобразования. \n +Highpass filter cutoff frequency after transformation. \n \n \param[in,out] beta -Указатель на вектор коэффициентов числителя передаточной функции \f$F(s)\f$ -ФВЧ после преобразования. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the highwpass filter transfer function \f$F(s)\f$ numerator +coefficients vector after transformation. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[in,out] alpha -Указатель на вектор коэффициентов знаменателя передаточной функции \f$F(s)\f$ -аналогового ФВЧ после преобразования. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the highwpass filter transfer function \f$F(s)\f$ denominator +coefficients vector after transformation. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- преобразование рассчитано успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -70,61 +65,59 @@ www.dsplib.org \ingroup IIR_FILTER_DESIGN_GROUP \fn int low2low(double* b, double* a, int ord, double w0, double w1, double* beta, double* alpha) -\brief Частотное преобразование ФНЧ-ФНЧ -Функция производит преобразование передаточной функции \f$ H(s) \f$ -аналогового ФНЧ с частотой среза `w0` рад/c -в передаточную функцию \f$ F(s) \f$ аналоговго ФНЧ с частотой среза `w1` рад/c. +Lowpass to lowpass filter frequency transform -Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе -заграждения и порядок фильтра остаются неизменными. +Function transforms lowpass filter transfer function \f$ H(s) \f$ +to the lowpass filter transfer function \f$ F(s) \f$ +with other cutoff frequency. + +Filter order, magnitude ripple in passband and stopband +supression still the same. \param[in] b -Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$ -исходного аналогового ФНЧ. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the input lowpass filter transfer function \f$H(s)\f$ numerator +coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] a -Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$ -исходного аналогового ФНЧ. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the input lowpass filter transfer function \f$H(s)\f$ denominator +coefficients vector. \n +Vector size is `[ord+1 x 1]`. \n \n \param[in] ord -Порядок исходного фильтра и фильтра после преобразования. \n +Filter order. \n \n \param[in] w0 -Частота среза исходного ФНЧ. \n +Input lowpass filter cutoff frequency. \n \n \param[in] w1 -Требуемая частота среза ФНЧ после преобразования. \n +Lowpass filter cutoff frequency after transformation. \n \n -\param[in,out] beta Указатель на вектор коэффициентов числителя -передаточной функции \f$F(s)\f$ ФНЧ после преобразования. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +\param[in,out] beta +Pointer to the lowpass filter transfer function \f$F(s)\f$ numerator +coefficients vector after transformation. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[in,out] alpha -Указатель на вектор коэффициентов знаменателя передаточной функции \f$F(s)\f$ -аналогового ФНЧ после преобразования. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the lowpass filter transfer function \f$F(s)\f$ denominator +coefficients vector after transformation. \n +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- Преоборазование расчитано успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if filter coefficients is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -140,9 +133,9 @@ www.dsplib.org \fn int ratcompos( double* b, double* a, int n, double* c, double* d, int p, double* beta, double* alpha) -\brief Рациональная композиця +\brief Rational composition -Функция рассчитывает композицию вида \f$Y(s) = (H \circ F)(s) = H(F(s))\f$, где +Function calcultes composition \f$Y(s) = (H \circ F)(s) = H(F(s))\f$, here \f[ H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m} @@ -153,65 +146,59 @@ Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m} {\sum\limits_{k = 0}^{n p} \alpha_k s^k} \f] -Функция рациональной композиции необходима для произведения частотных -преобразований передаточных характеристик аналоговых и цифровых фильтров, -а также для билинейного преобразования передаточных характеристик аналоговых -фильтров в соответствующие передаточные характеристики цифровых фильтров. +This function is using for filter frequency transform. \param[in] b -Указатель на вектор коэффициентов числителя функции \f$H(s)\f$. \n -Размер вектора `[n+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$H(s)\f$ polynomial function +numerator coefficients vector. \n +Vector size is `[n+1 x 1]`. \n \n \param[in] a -Указатель на вектор коэффициентов знаменателя функции \f$H(s)\f$. \n -Размер вектора `[n+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$H(s)\f$ polynomial function +denominator coefficients vector. \n +Vector size is `[n+1 x 1]`. \n \n \param[in] n -Порядок полиномов рациональной функции \f$H(s)\f$. \n +Order of \f$H(s)\f$ numerator and denominator polynomials. \n \n \param[in] c -Указатель на вектор коэффициентов числителя функции \f$F(s)\f$. \n -Размер вектора `[p+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$F(s)\f$ polynomial function +numerator coefficients vector. \n +Vector size is `[p+1 x 1]`. \n \n \param[in] d -Указатель на вектор коэффициентов знаменателя функции \f$F(s)\f$. \n -Размер вектора `[p+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the \f$F(s)\f$ polynomial function +denominator coefficients vector. \n +Vector size is `[p+1 x 1]`. \n \n \param[in] p -Порядок полиномов рациональной -функции \f$F(s)\f$. \n +Order of \f$F(s)\f$ numerator and denominator polynomials. \n \n \param[in,out] beta -Указатель на вектор коэффициентов -числителя функции \f$Y(s) = (H \circ F)(s)\f$. \n -Размер вектора `[n*p+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the numerator coefficients vector of +\f$Y(s) = (H \circ F)(s)\f$. \n +Vector size is `[n*p+1 x 1]`. \n +Memory must be allocated. \n \n \param[in,out] alpha -Указатель на вектор коэффициентов знаменателя -функции \f$Y(s) = (H \circ F)(s)\f$. \n -Размер вектора `[n*p+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the denominator coefficients vector of +\f$Y(s) = (H \circ F)(s)\f$. \n +Vector size is `[n*p+1 x 1]`. \n +Memory must be allocated. \n \n - + \return -`RES_OK` --- Рациональная композиция рассчитана успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if rational composition is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ diff --git a/dspl/dox/en/filter_iir.dox b/dspl/dox/en/filter_iir.dox index 6645ab8..1bbf8dd 100644 --- a/dspl/dox/en/filter_iir.dox +++ b/dspl/dox/en/filter_iir.dox @@ -5,74 +5,71 @@ \fn int bilinear(double* bs, double* as, int ord, double* bz, double* az) \brief -Билинейное преобразование передаточной характеристики аналогового -фильтра \f$H(s)\f$, в передаточную характеристику цифрового фильтра \f$H(z)\f$. +Transform a s-plane analog filter transfer function \f$H(s)\f$ to the +digital filter transfer function \f$H(z)\f$. -Функция рассчитывает коэффициенты передаточной характеристики \f$H(z)\f$ -цифрового фильтра путем дробно-рациональной подстановки вида +Bilinear transform is rational composition: \f[ s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}. \f] -Порядок цифрового фильтра при этом остается равным порядку аналогового фильтра, -а ось частот \f$\Omega\f$ аналогового фильтра связана c осью частот -\f$\omega\f$ цифрового фильтра соотношением: +Digital filter order, passband magnitude ripple and stopband suppression +still the same after bilinear transform as analog filter. + +Frequency \f$\Omega\f$ of analog filter and frequency +\f$\omega\f$ of digital filter relations: \f[ \Omega = \tan(\omega / 2). \f] - \param[in] bs -Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$ -исходного аналогового фильтра. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of analog filter \f$H(s)\f$ +numerator coefficients. +Vector size is `[ord+1 x 1]`. \n \n \param[in] as -Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$ -исходного аналогового фильтра. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of analog filter \f$H(s)\f$ +denominator coefficients vector. +Vector size is `[ord+1 x 1]`. \n \n \param[in] ord -Порядок фильтра. \n -Количество коэффициентов числителя и знаменателя передаточных функций -\f$H(s)\f$ и \f$H(z)\f$ аналогового и цифрового фильтров равно `ord+1`. \n +Analog and digital filters order. \n \n \param[out] bz -Указатель на вектор коэффициентов числителя передаточной функции \f$H(z)\f$ -полученного цифрового фильтра. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of digital filter \f$H(z)\f$ +numerator coefficients after bilinear transform. +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \param[out] az -Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(z)\f$ -полученного цифрового фильтра. \n -Размер вектора `[ord+1 x 1]`. \n -Память должна быть выделена. \n +Pointer to the vector of digital filter \f$H(z)\f$ +denominator coefficients after bilinear transform. +Vector size is `[ord+1 x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- фильтр рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if bilinear transform is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -Пример использования функции `bilinear`: +Example: \include bilinear_test.c -Данная программа производит расчет передаточной характеристики аналогового -фильтра Чебышева первого рода, с частотой среза равной 1 рад/с, и производит -билинейное преобразование в цифровой, с частотой среза равной 0.5. +This program calculates the transfer function \f$H(s)\f$ of analog +Chebyshev filter of the first kind, with a cutoff frequency of 1 rad/s, +and produces bilinear trandform to digital filter, +with a normilized cutoff frequency equals 0.5. -Результат работы программы: +Result: \verbatim bz[0] = 0.246 az[0] = 4.425 @@ -83,14 +80,12 @@ bz[4] = 0.246 az[4] = 1.034 err = 0 \endverbatim -Кроме этого производится расчет АЧХ полученного цифрового фильтра и строится -график АЧХ пакетом GNUPLOT +In addition, the frequency response of the resulting digital filter +is calculated and plotted by GNUPLOT package. \image html bilinear.png -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -104,91 +99,86 @@ www.dsplib.org \fn int iir(double rp, double rs, int ord, double w0, double w1, int type, double* b, double* a) \brief -Функция расчета коэффициентов передаточной характеристики \f$H(z)\f$ -цифрового фильтра БИХ. +Digital IIR filter design. -Функция рассчитывает коэффициенты передаточной характеристики \f$H(z)\f$ -цифрового фильтра, которые могут быть использованы в функции \ref filter_iir +The function calculates the coefficients of the digital IIR filter +transfer fucntion \f$ H(z) \f$. +Filter coeffitients can be used in \ref filter_iir function \param[in] rp -Уровень неравномерности квадрата АЧХ в полосе пропускания фильтра (дБ). \n -Размер вектора `[ord+1 x 1]`. \n +Magnitude ripple in passband (dB). \n \n \param[in] rs -Уровень подавления в полосе заграждения фильтра (дБ).\n +Suppression level in stopband (dB). \n \n \param[in] ord -Порядок фильтра. \n -Количество коэффициентов числителя и знаменателя передаточной -функции \f$H(z)\f$ цифрового фильтров равно `ord+1`. \n -Для полосовых и режекторных фильтров параметр `ord` должен быть чётным. \n +Filter order. \n +Number of \f$H(z)\f$ numerator and denominator coefficients is `ord+1`. \n +For bandpass and bandstop filters `ord` must be even. \n \n \param[in] w0 -Нормированная частота среза ФНЧ или ФВЧ, или левая частота среза для -полосового и режекторного фильтра.\n +Normalized cutoff frequency (from 0 to 1) for lowpass or highpass filter. \n +Or left normalized cutoff frequency (from 0 to 1) for +bandpass and bandstop filter. \n \n \param[in] w1 -Правая частота среза полосового и режекторного фильтра. \n -Данный параметр игнорируется для ФНЧ и ФВЧ. \n +Right normalized cutoff frequency (from 0 to 1) for +bandpass and bandstop filter. \n +This parameter is ingnored for lowpass and highpass filters. \n \param[in] type -Тип фильтра. \n -Данный параметр определяет тип фильтра и образуется -набором флагов типа фильтра: \n +Filter type. \n +This patameter sets combination of filter type (one of follow): \n \verbatim -DSPL_FILTER_LPF - фильтр нижних частот; -DSPL_FILTER_HPF - фильтр верхних частот; -DSPL_FILTER_BPASS - полосовой фильтр; -DSPL_FILTER_BSTOP - режекторный фильтр, +DSPL_FILTER_LPF - lowpass filter; +DSPL_FILTER_HPF - highpass filter; +DSPL_FILTER_BPASS - bandpass filter; +DSPL_FILTER_BSTOP - bandstop filter, \endverbatim -а также флагов типа аппроксимации АЧХ фильтра: +and of filter approximation type (one of follow): \verbatim -DSPL_FILTER_BUTTER - фильтр Баттерворта; -DSPL_FILTER_CHEBY1 - фильтр Чебышева первого рода; -DSPL_FILTER_CHEBY2 - фильтр Чебышева второго рода; -DSPL_FILTER_ELLIP - эллиптический фильтр. +DSPL_FILTER_BUTTER - Butterworth filter; +DSPL_FILTER_CHEBY1 - Chebyshev of the first kind filter; +DSPL_FILTER_CHEBY2 - Chebyshev of the second kind filter; +DSPL_FILTER_ELLIP - Elliptic filter. \endverbatim \n \n \param[out] b -Указатель на вектор коэффициентов -числителя передаточной функции \f$H(z)\f$. \n -Размер вектора `ord+1`. \n -Память должна быть выделена. \n +Pointer to the transfer function \f$H(z)\f$ +numerator coefficients vector. \n +Vector size is `ord+1`. \n +Memory must be allocated. \n \n \param[out] a -Указатель на вектор коэффициентов знаменателя передаточной -функции \f$H(z)\f$. \n -Размер вектора `ord+1`. \n -Память должна быть выделена. \n +Pointer to the transfer function \f$H(z)\f$ +denominator coefficients vector. \n +Vector size is `ord+1`. \n \n \return -`RES_OK` --- Фильтр рассчитан успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if filter is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". -Пример использования функции: +Example: \include iir_test.c -Данная программа производит расчет коэффициентов фильтров -при различном сочетании флагов параметра `type`. +This program calcultes filter coefficients for different flags `type`. -Кроме этого производится расчет АЧХ полученных цифровых фильтров и выводится на -график АЧХ пакетом GNUPLOT +In addition, the filters magnitudes +is calculated and plotted by GNUPLOT package. \image html iir_test.png -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ \ No newline at end of file diff --git a/dspl/dox/en/fourier_series.dox b/dspl/dox/en/fourier_series.dox index 92dc404..dde3b70 100644 --- a/dspl/dox/en/fourier_series.dox +++ b/dspl/dox/en/fourier_series.dox @@ -4,64 +4,55 @@ int nw, double* w, complex_t* y) \brief -Расчет коэффициентов разложения в ряд Фурье - -Функция рассчитывает спектр периодического сигнала при усечении ряда Фурье \n - +Fourier series coefficient calculation for periodic signal \param[in] t -Указатель на массив моментов времени дискретизации исходного сигнала `s`. \n -Размер вектора вектора `[nt x 1]`. \n -Память должна быть выделена. \n +Pointer to the time vector. \n +Vector size is `[nt x 1]`. \n \n \param[in] s -Указатель на массив значений исходного сигнала`s`. \n -Размер вектора `[nt x 1]`. \n -Память должна быть выделена. \n +Pointer to the signal corresponds to time `t`. \n +Vector size is `[nt x 1]`. \n \n - \param[in] nt -Размер выборки исходного сигнала. \n -Значение должно быть положительным. \n +Size of time and signal vectors. \n +This value must be positive. \n \n \param[in] period -Период повторения сигнала. \n +Signal time period. \n \n \param[in] nw -Размер усеченного ряда Фурье. \n +Number of Fourie series coefficients. \n \n \param[out] w -Указатель на массив частот спектра периодического сигнала. \n -Размер вектора `[nw x 1]`. \n -Память должна быть выделена. \n +Pointer to the frequency vector (rad/s). \n +Vector size is `[nw x 1]`. \n +Memory must be allocated. \n \n \param[out] y -Указатель массив комплексных значений спектра периодического сигнала. \n -Размер вектора `[nw x 1]`. \n -Память должна быть выделена. \n +Pointer to the complex Fourier series coefficients vector. \n +Vector size is `[nw x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- коэффициенты ряда Фурье рассчитаны успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if function is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". \note -Для расчета спектра сигнала используется численное интегрирование -исходного сигнала методом трапеций. Данная функция не является -эффективной. Для увеличения скорости расчета спектра сигнала -целесообразнее использовать алгоритмы дискретного -и быстрого преобразования Фурье. +Numerical integration is used for Fourier series coefficients calculation. +This function is not effective. +To increase the speed of calculation of the signal spectrum +it is more expedient to use fast Fourier transform algorithms. \n -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ @@ -73,61 +64,56 @@ www.dsplib.org \ingroup DFT_GROUP \fn int fourier_series_rec(double* w, complex_t* s, int nw, double* t, int nt, complex_t* y) -\brief Восстановление сигнала при усечении ряда Фурье +\brief Time signal reconstruction from Fourier series coefficients. -Функция рассчитывает восстановленный сигнал при усечении ряда Фурье: +Function reconstructs the time signal: \f[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \f] \param[in] w -Указатель на массив частот \f$\omega_n\f$ усеченного ряда Фурье. \n -Размер вектора `[nw x 1]`. \n -Память должна быть выделена и заполнена. \n +Pointer to the Fourier series spectrum frequency vector \f$\omega_n\f$. \n +Vector size is `[nw x 1]`. \n \n \param[in] s -Указатель на массив значений спектра \f$S(\omega_n)\f$. \n -Размер вектора `[nw x 1]`. \n -Память должна быть выделена и заполнена. \n +Pointer to the Fourier series coefficients vector \f$S(\omega_n)\f$. \n +Vector size is `[nw x 1]`. \n \n \param[in] nw -Количество членов усеченного ряда Фурье. \n -Значение должно быть положительным. \n +Number of Fourier series coefficients. \n +This value must be positive. \n \n -\param[in] t Указатель на массив временных отсчетов -восстановленного сигнала. \n -Размер вектора `[nt x 1]`. \n -Память должна быть выделена и заполнена. \n +\param[in] t +Pointer to the reconstructed signal time vector. \n +Vector size is `[nt x 1]`. \n \n \param[in] nt -Размер вектора времени и восстановленного сигнала. \n +Size of time vector and reconstructed signal vector . \n \n \param[out] y -Указатель на массив восстановленного сигнала. \n -Размер вектора `[nt x 1]`. \n -Память должна быть выделена. \n +Pointer to the reconstructed signal vector. \n +Vector size is `[nt x 1]`. \n +Memory must be allocated. \n \n \return -`RES_OK` --- восстановление сигнала прошло успешно. \n -В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n +`RES_OK` if function is calculated successfully. \n +Else \ref ERROR_CODE_GROUP "code error". \note -Выходной восстановленный сигнал в общем случае является комплексным. -Однако при соблюдении свойств симметрии векторов `w` и `s` относительно -нулевой частоты получим мнимую часть элементов вектора `y` на уровне ошибок -округления числа с двойной точностью. Ничтожно малую мнимую часть в этом случае -можно игнорировать. +The output reconstructed signal is generally complex. +However, subject to the symmetry properties of the vectors `w` and` s` +with respect to zero frequency we get the imaginary part of the vector `y` +at the EPS level. The negligible imaginary part in this case +can be ignored. \n -\author -Бахурин Сергей -www.dsplib.org +\author Sergey Bakhurin www.dsplib.org ***************************************************************************** */ diff --git a/dspl/src/dspl_internal.h b/dspl/src/dspl_internal.h index c42d290..3787d64 100644 --- a/dspl/src/dspl_internal.h +++ b/dspl/src/dspl_internal.h @@ -57,11 +57,16 @@ void dft5 (complex_t *x, complex_t* y); #define DFT7_W8 -0.874842290961656665615465 void dft7 (complex_t *x, complex_t* y); +#define DFT8_W 0.707106781186548 +void dft8 (complex_t *x, complex_t* y); +void transpose2x4(complex_t *x, complex_t* y); +void transpose4x2(complex_t *x, complex_t* y); + + #define DFT16_W1 0.923879532511287 #define DFT16_W2 0.382683432365090 #define DFT16_W3 0.707106781186548 void dft16 (complex_t *x, complex_t* y); - void transpose4x4(complex_t *x, complex_t* y); diff --git a/dspl/src/fft.c b/dspl/src/fft.c index 1eac26f..5730601 100644 --- a/dspl/src/fft.c +++ b/dspl/src/fft.c @@ -122,6 +122,7 @@ int fft_krn(complex_t* t0, complex_t* t1, fft_t* p, int n, int addr) n1 = 1; if(n%16== 0) { n1 = 16; goto label_size; } if(n%7 == 0) { n1 = 7; goto label_size; } + if(n%8 == 0) { n1 = 8; goto label_size; } if(n%5 == 0) { n1 = 5; goto label_size; } if(n%4 == 0) { n1 = 4; goto label_size; } if(n%3 == 0) { n1 = 3; goto label_size; } @@ -159,7 +160,11 @@ label_size: if(n1 == 7) for(k = 0; k < n2; k++) - dft7(t0+7*k, t1+7*k); + dft7(t0+7*k, t1+7*k); + + if(n1 == 8) + for(k = 0; k < n2; k++) + dft8(t0+8*k, t1+8*k); if(n1 == 5) for(k = 0; k < n2; k++) @@ -221,6 +226,7 @@ int DSPL_API fft_create(fft_t* pfft, int n) n2 = 1; if(s%16== 0) { n2 = 16; goto label_size; } if(s%7 == 0) { n2 = 7; goto label_size; } + if(s%8 == 0) { n2 = 8; goto label_size; } if(s%5 == 0) { n2 = 5; goto label_size; } if(s%4 == 0) { n2 = 4; goto label_size; } if(s%3 == 0) { n2 = 3; goto label_size; } diff --git a/dspl/src/fft_subkernel.c b/dspl/src/fft_subkernel.c index fe003be..6c354a4 100644 --- a/dspl/src/fft_subkernel.c +++ b/dspl/src/fft_subkernel.c @@ -173,6 +173,10 @@ void dft5 (complex_t *x, complex_t* y) } + +/******************************************************************************* +7 points DFT (Winograd algorithm) +*******************************************************************************/ void dft7 (complex_t *x, complex_t* y) { complex_t sum[31]; @@ -193,6 +197,7 @@ void dft7 (complex_t *x, complex_t* y) /* Winograd paper mistake?! */ RE(sum[5]) = RE(x[2]) + RE(x[5]); IM(sum[5]) = IM(x[2]) + IM(x[5]); + /* Winograd paper mistake?! */ RE(sum[6]) = RE(x[2]) - RE(x[5]); IM(sum[6]) = IM(x[2]) - IM(x[5]); @@ -314,6 +319,60 @@ void dft7 (complex_t *x, complex_t* y) } +/******************************************************************************* +8 points DFT +*******************************************************************************/ +void dft8 (complex_t *x, complex_t* y) +{ + complex_t t0[8]; + complex_t t1[8]; + double tmp; + + transpose2x4(x, t0); + + dft4(t0, t1); + dft4(t0+4, t1+4); + + /* 0.707106781186548 - 707106781186548i */ + tmp = (RE(t1[5]) + IM(t1[5])) * DFT8_W; + IM(t1[5]) = (IM(t1[5]) - RE(t1[5])) * DFT8_W; + RE(t1[5]) = tmp; + + /* 0.000000000000000 - 1.000000000000000i */ + tmp = RE(t1[6]); + RE(t1[6]) = IM(t1[6]); + IM(t1[6]) = -tmp; + + /* -0.707106781186548 - 707106781186548i */ + tmp = (IM(t1[7]) - RE(t1[7])) * DFT8_W; + IM(t1[7]) = -(IM(t1[7]) + RE(t1[7])) * DFT8_W; + RE(t1[7]) = tmp; + + transpose4x2(t1, t0); + + RE(t1[0]) = RE(t0[0]) + RE(t0[1]); + IM(t1[0]) = IM(t0[0]) + IM(t0[1]); + RE(t1[1]) = RE(t0[0]) - RE(t0[1]); + IM(t1[1]) = IM(t0[0]) - IM(t0[1]); + + RE(t1[2]) = RE(t0[2]) + RE(t0[3]); + IM(t1[2]) = IM(t0[2]) + IM(t0[3]); + RE(t1[3]) = RE(t0[2]) - RE(t0[3]); + IM(t1[3]) = IM(t0[2]) - IM(t0[3]); + + RE(t1[4]) = RE(t0[4]) + RE(t0[5]); + IM(t1[4]) = IM(t0[4]) + IM(t0[5]); + RE(t1[5]) = RE(t0[4]) - RE(t0[5]); + IM(t1[5]) = IM(t0[4]) - IM(t0[5]); + + RE(t1[6]) = RE(t0[6]) + RE(t0[7]); + IM(t1[6]) = IM(t0[6]) + IM(t0[7]); + RE(t1[7]) = RE(t0[6]) - RE(t0[7]); + IM(t1[7]) = IM(t0[6]) - IM(t0[7]); + + transpose2x4(t1, y); +} + /******************************************************************************* 16 points DFT (Winograd algorithm) *******************************************************************************/ @@ -391,6 +450,42 @@ void dft16 (complex_t *x, complex_t* y) } + + + +/******************************************************************************* +4 x 2 matrix transpose +*******************************************************************************/ +void transpose4x2(complex_t *x, complex_t* y) +{ + RE(y[ 0]) = RE(x[ 0]); IM(y[ 0]) = IM(x[ 0]); + RE(y[ 1]) = RE(x[ 4]); IM(y[ 1]) = IM(x[ 4]); + RE(y[ 2]) = RE(x[ 1]); IM(y[ 2]) = IM(x[ 1]); + RE(y[ 3]) = RE(x[ 5]); IM(y[ 3]) = IM(x[ 5]); + RE(y[ 4]) = RE(x[ 2]); IM(y[ 4]) = IM(x[ 2]); + RE(y[ 5]) = RE(x[ 6]); IM(y[ 5]) = IM(x[ 6]); + RE(y[ 6]) = RE(x[ 3]); IM(y[ 6]) = IM(x[ 3]); + RE(y[ 7]) = RE(x[ 7]); IM(y[ 7]) = IM(x[ 7]); +} + + +/******************************************************************************* +2 x 4 matrix transpose +*******************************************************************************/ +void transpose2x4(complex_t *x, complex_t* y) +{ + RE(y[ 0]) = RE(x[ 0]); IM(y[ 0]) = IM(x[ 0]); + RE(y[ 1]) = RE(x[ 2]); IM(y[ 1]) = IM(x[ 2]); + RE(y[ 2]) = RE(x[ 4]); IM(y[ 2]) = IM(x[ 4]); + RE(y[ 3]) = RE(x[ 6]); IM(y[ 3]) = IM(x[ 6]); + RE(y[ 4]) = RE(x[ 1]); IM(y[ 4]) = IM(x[ 1]); + RE(y[ 5]) = RE(x[ 3]); IM(y[ 5]) = IM(x[ 3]); + RE(y[ 6]) = RE(x[ 5]); IM(y[ 6]) = IM(x[ 5]); + RE(y[ 7]) = RE(x[ 7]); IM(y[ 7]) = IM(x[ 7]); +} + + + /******************************************************************************* 4 x 4 matrix transpose *******************************************************************************/ diff --git a/examples/Makefile b/examples/Makefile index 8cfd6f2..15b1382 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -25,11 +25,11 @@ all: $(EXE_FILES) $(RELEASE_DIR)/%.exe:$(OBJ_DIR)/%.o $(DSPL_O) - $(CC) $< $(DSPL_O) -o $@ -ldl -lm + $(CC) $< $(DSPL_O) -o $@ $(LFLAGS) $(OBJ_DIR)/%.o:$(SRC_DIR)/%.c - $(CC) $(CFLAGS) $< -o $@ -ldl -lm + $(CC) $(CFLAGS) $< -o $@ $(LFLAGS) $(DSPL_O):$(DSPL_C) $(CC) $(CFLAGS) $(DSPL_C) -o $(DSPL_O) diff --git a/examples/src/array_test.c b/examples/src/array_test.c index cb9134c..4e17905 100644 --- a/examples/src/array_test.c +++ b/examples/src/array_test.c @@ -5,8 +5,8 @@ int main() { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* handle; /* DSPL handle */ + handle = dspl_load(); /* Load DSPL function */ double a[5] = {0.0, 1.0, 2.0, 3.0, 4.0}; double b[5] = {5.0, 6.0, 7.0, 8.0, 9.0}; @@ -17,27 +17,27 @@ int main() err = vector_dot(a, b, 5, &r); printf("\n\ndot product result: %d a^T * b = %f ", err, r); - // Concatenate arrays a and b. Result keeps to the array c + /* Concatenate arrays a and b. Result keeps to the array c */ err = concat((void*)a, 5*sizeof(double), (void*)b, 5*sizeof(double), (void*)c); printf("\n\nconcatenation result: %d\n\narray c = ", err); for(k = 0; k < 10; k++) printf("%6.1f", c[k]); - // Decimate array c 2 times. Result keeps to the array d + /* Decimate array c 2 times. Result keeps to the array d */ err = decimate(c, 10, 2, d, &n); printf("\n\ndecimation result: %d\n\narray d = ", err); for (k = 0; k < n; k++) printf("%6.1f", d[k]); - // find max abs value + /* find max abs value */ double am[5] = {0.0, 2.0, -5.0, 4.0, 2.0}; double m; int ind; err = find_max_abs(am, 5, &m, &ind); printf("\n\nmax absolute value: %8.1f (index %d)", m, ind); - + /* Flip in place */ printf("\n\nFlipip function test:\n\n"); double x[5] = {0.0, 1.0, 2.0, 3.0, 4.0}; int i; @@ -58,8 +58,8 @@ int main() for(i = 0; i < 5; i++) printf("%6.1f%+.1fj ", RE(y[i]), IM(y[i])); - - dspl_free(handle); // free dspl handle + /* free dspl handle */ + dspl_free(handle); return err; } diff --git a/examples/src/bessel_i0.c b/examples/src/bessel_i0.c index 899fddc..08353ef 100644 --- a/examples/src/bessel_i0.c +++ b/examples/src/bessel_i0.c @@ -42,7 +42,7 @@ int main(int argc, char* argv[]) /* free dspl handle */ - dspl_free(hdspl); + dspl_free(hdspl); return 0; } diff --git a/examples/src/butter_ap_test.c b/examples/src/butter_ap_test.c index 3d12cad..fe0366f 100644 --- a/examples/src/butter_ap_test.c +++ b/examples/src/butter_ap_test.c @@ -3,8 +3,11 @@ #include #include "dspl.h" -#define ORD 3 -#define N 1000 +/* Filter order */ +#define ORD 3 + +/* Frequency response vector size */ +#define N 1000 int main(int argc, char* argv[]) @@ -13,42 +16,42 @@ int main(int argc, char* argv[]) void* hplot; /* GNUPLOT handle */ /* Load DSPL functions */ - hdspl = dspl_load(); + hdspl = dspl_load(); - double a[ORD+1]; /* Коэффициенты числителя H(s) */ - double b[ORD+1]; /* Коэффициенты знаменателя H(s) */ - double Rp = 1.0; /* Неравномерность АЧХ (к-т передачи на частоте 1 рад/c) */ - double w[N]; /* Циклическая частота рад/c */ - double mag[N]; /* АЧХ фильтра */ - double phi[N]; /* ФЧХ фильтра */ - double tau[N]; /* ГВЗ фильтра */ + double a[ORD+1]; /* H(s) numerator coefficients vector */ + double b[ORD+1]; /* H(s) denominator coefficients vector */ + double Rp = 1.0; /* Magnitude ripple from 0 to 1 rad/s */ + double w[N]; /* Angular frequency (rad/s) */ + double mag[N]; /* Filter Magnitude (dB) */ + double phi[N]; /* Phase response */ + double tau[N]; /* Group delay */ int k; - /* Расчет коэффициентов фильтра */ + /* H(s) coefficients calculation */ int res = butter_ap(Rp, ORD, b, a); if(res != RES_OK) printf("error code = 0x%8x\n", res); - /* Печать векторов коэффициентов */ + /* Print H(s) coefficients */ for(k = 0; k < ORD+1; k++) printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]); - /* Частота в логарифмическом масштабе от 0.01 до 100 рад/с */ + /* Frequency in logarithmic scale from 0.01 to 100 rad/s */ logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w); - /* Расчет частотных характеристик рассчитанного фильтра */ + /* Filter frequency parameter calculation */ filter_freq_resp(b, a, ORD, w, N, DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP|DSPL_FLAG_ANALOG, mag, phi, tau); - /* сохранение рассчитанных характеристик в файлы */ + /* Write Magnitude, phase response and group delay to the files */ writetxt(w, mag, N, "dat/butter_ap_test_mag.txt"); writetxt(w, phi, N, "dat/butter_ap_test_phi.txt"); writetxt(w, tau, N, "dat/butter_ap_test_tau.txt"); - /* plotting by GNUPLOT */ + /* plotting by GNUPLOT */ gnuplot_create(argc, argv, 920, 260, "img/butter_ap_test.png", &hplot); gnuplot_cmd(hplot, "set logscale x"); gnuplot_cmd(hplot, "unset key"); diff --git a/examples/src/cheby1_ap_test.c b/examples/src/cheby1_ap_test.c index 2773713..5f47bbf 100644 --- a/examples/src/cheby1_ap_test.c +++ b/examples/src/cheby1_ap_test.c @@ -3,10 +3,10 @@ #include #include "dspl.h" -/* Порядок фильтра */ +/* Filter order */ #define ORD 4 -/* размер векторов частотной характеристики фильтра */ +/* Frequency response vector size */ #define N 1000 @@ -16,33 +16,33 @@ int main(int argc, char* argv[]) void* hplot; /* GNUPLOT handle */ hdspl = dspl_load(); /* Load DSPL function */ - double a[ORD+1]; /* Коэффициенты числителя H(s) */ - double b[ORD+1]; /* Коэффициенты знаменателя H(s) */ - double Rp = 1.0; /* Неравномерность АЧХ (к-т передачи на частоте 1 рад/c) */ - double w[N]; /* Циклическая частота рад/c */ - double mag[N]; /* АЧХ фильтра */ - double phi[N]; /* ФЧХ фильтра */ - double tau[N]; /* ГВЗ фильтра */ + double a[ORD+1]; /* H(s) numerator coefficients vector */ + double b[ORD+1]; /* H(s) denominator coefficients vector */ + double Rp = 1.0; /* Magnitude ripple from 0 to 1 rad/s */ + double w[N]; /* Angular frequency (rad/s) */ + double mag[N]; /* Filter Magnitude (dB) */ + double phi[N]; /* Phase response */ + double tau[N]; /* Group delay */ int k; - /* рассчитываем нормированный ФНЧ Чебышева 1 рода */ + /* H(s) coefficients calculation */ int res = cheby1_ap(Rp, ORD, b, a); if(res != RES_OK) printf("error code = 0x%8x\n", res); - /* печать коэффициентов фильтра */ + /* Print H(s) coefficients */ for(k = 0; k < ORD+1; k++) printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]); - /* вектор частоты в логарифмической шакале от 0.01 до 100 рад/c */ + /* Frequency in logarithmic scale from 0.01 to 100 rad/s */ logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w); - /* частотные характеристика фильтра */ + /* Filter frequency parameter calculation */ filter_freq_resp(b, a, ORD, w, N, DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP | DSPL_FLAG_ANALOG, mag, phi, tau); - /* Сохранить характеристики для построения графиков */ + /* Write Magnitude, phase response and group delay to the files */ writetxt(w, mag, N, "dat/cheby1_ap_test_mag.txt"); writetxt(w, phi, N, "dat/cheby1_ap_test_phi.txt"); writetxt(w, tau, N, "dat/cheby1_ap_test_tau.txt"); diff --git a/examples/src/cheby2_ap_test.c b/examples/src/cheby2_ap_test.c index 621d5c1..9ac1b1c 100644 --- a/examples/src/cheby2_ap_test.c +++ b/examples/src/cheby2_ap_test.c @@ -3,23 +3,23 @@ #include #include "dspl.h" -/* Порядок фильтра */ +/* Filter order */ #define ORD 4 -/* размер векторов частотной характеристики фильтра */ +/* Frequency response vector size */ #define N 1000 int main(int argc, char* argv[]) { - void* hdspl; /* DSPL handle */ - void* hplot; /* GNUPLOT handle */ - double a[ORD+1]; /* Коэффициенты числителя H(s) */ - double b[ORD+1]; /* Коэффициенты знаменателя H(s) */ - double Rs = 60.0; /* Подавление АЧХ в полосе заграждения */ - double w[N]; /* Циклическая частота рад/c */ - double mag[N]; /* АЧХ фильтра */ - double phi[N]; /* ФЧХ фильтра */ - double tau[N]; /* ГВЗ фильтра */ + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + double a[ORD+1]; /* H(s) numerator coefficients vector */ + double b[ORD+1]; /* H(s) denominator coefficients vector */ + double Rs = 60.0; /* Stopband suppression (dB) */ + double w[N]; /* Angular frequency (rad/s) */ + double mag[N]; /* Filter Magnitude (dB) */ + double phi[N]; /* Phase response */ + double tau[N]; /* Group delay */ int k; /* Load DSPL function */ @@ -30,24 +30,24 @@ int main(int argc, char* argv[]) return -1; } - /* рассчитываем нормированный ФНЧ Чебышева 2 рода */ + /* H(s) coefficients calculation */ int res = cheby2_ap(Rs, ORD, b, a); if(res != RES_OK) printf("error code = 0x%8x\n", res); - /* печать коэффициентов фильтра */ + /* Print H(s) coefficients */ for(k = 0; k < ORD+1; k++) printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]); - /* вектор частоты в логарифмической шакале от 0.01 до 100 рад/c */ + /* Frequency in logarithmic scale from 0.01 to 100 rad/s */ logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w); - /* частотные характеристика фильтра */ + /* Filter frequency parameter calculation */ filter_freq_resp(b, a, ORD, w, N, DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP | DSPL_FLAG_ANALOG, mag, phi, tau); - /* Сохранить характеристики для построения графиков */ + /* Write Magnitude, phase response and group delay to the files */ writetxt(w, mag, N, "dat/cheby2_ap_test_mag.txt"); writetxt(w, phi, N, "dat/cheby2_ap_test_phi.txt"); writetxt(w, tau, N, "dat/cheby2_ap_test_tau.txt"); diff --git a/examples/src/dft_test.c b/examples/src/dft_test.c index 0361442..3385142 100644 --- a/examples/src/dft_test.c +++ b/examples/src/dft_test.c @@ -3,26 +3,31 @@ #include #include "dspl.h" +/* DFT size */ #define N 16 + int main() { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function - - double x[N]; // real input signal - complex_t y[N]; // DFT + void* handle; /* DSPL handle */ + handle = dspl_load(); /* Load DSPL function */ + double x[N]; /* real input signal */ + complex_t y[N]; /* DFT vector */ int k; + /* fill input signal */ for(k = 0; k < N; k++) x[k] = (double)k; + /* DFT calculation */ dft(x, N, y); + /* Print result */ for(k = 0; k < N; k++) printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k])); - dspl_free(handle); // remember to free the resource + /* remember to free the resource */ + dspl_free(handle); return 0; } diff --git a/examples/src/ellip_ap_test.c b/examples/src/ellip_ap_test.c index 0f5dc04..7279430 100644 --- a/examples/src/ellip_ap_test.c +++ b/examples/src/ellip_ap_test.c @@ -3,10 +3,10 @@ #include #include "dspl.h" -/* Порядок фильтра */ +/* Filter order */ #define ORD 4 -/* размер векторов частотной характеристики фильтра */ +/* Frequency response vector size */ #define N 1000 @@ -16,34 +16,34 @@ int main(int argc, char* argv[]) void* hplot; /* GNUPLOT handle */ hdspl = dspl_load(); /* Load DSPL function */ - double a[ORD+1]; /* Коэффициенты числителя H(s) */ - double b[ORD+1]; /* Коэффициенты знаменателя H(s) */ - double Rp = 1.0; /* Неравномерность АЧХ (к-т передачи на частоте 1 рад/c) */ - double Rs = 60.0;/* Подавление в полосе заграждения (дБ) */ - double w[N]; /* Циклическая частота рад/c */ - double mag[N]; /* АЧХ фильтра */ - double phi[N]; /* ФЧХ фильтра */ - double tau[N]; /* ГВЗ фильтра */ + double a[ORD+1]; /* H(s) numerator coefficients vector */ + double b[ORD+1]; /* H(s) denominator coefficients vector */ + double Rp = 1.0; /* Magnitude ripple from 0 to 1 rad/s */ + double Rs = 60.0;/* Stopband suppression (dB) */ + double w[N]; /* Angular frequency (rad/s) */ + double mag[N]; /* Filter Magnitude (dB) */ + double phi[N]; /* Phase response */ + double tau[N]; /* Group delay */ int k; - /* рассчитываем нормированный ФНЧ Чебышева 1 рода */ + /* H(s) coefficients calculation */ int res = ellip_ap(Rp, Rs, ORD, b, a); if(res != RES_OK) printf("error code = 0x%8x\n", res); - /* печать коэффициентов фильтра */ + /* Print H(s) coefficients */ for(k = 0; k < ORD+1; k++) printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]); - /* вектор частоты в логарифмической шакале от 0.01 до 100 рад/c */ + /* Frequency in logarithmic scale from 0.01 to 100 rad/s */ logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w); - /* частотные характеристика фильтра */ + /* Filter frequency parameter calculation */ filter_freq_resp(b, a, ORD, w, N, DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP | DSPL_FLAG_ANALOG, mag, phi, tau); - /* Сохранить характеристики для построения графиков */ + /* Write Magnitude, phase response and group delay to the files */ writetxt(w, mag, N, "dat/ellip_ap_test_mag.txt"); writetxt(w, phi, N, "dat/ellip_ap_test_phi.txt"); writetxt(w, tau, N, "dat/ellip_ap_test_tau.txt"); diff --git a/examples/src/fft_cmplx_test.c b/examples/src/fft_cmplx_test.c index 96f0fb7..705e4b1 100644 --- a/examples/src/fft_cmplx_test.c +++ b/examples/src/fft_cmplx_test.c @@ -3,38 +3,37 @@ #include #include "dspl.h" +/* FFT size */ #define N 18 int main() { - void* handle; // DSPL handle - handle = dspl_load(); // Загрузка DSPL - - complex_t x[N]; // массив входного сигнала - complex_t y[N]; // массив результата БПФ - fft_t pfft; // FFT объект + void* handle; /* DSPL handle */ + handle = dspl_load(); /* Load libdspl */ + complex_t x[N]; /* Input signal array */ + complex_t y[N]; /* Output signal array */ + fft_t pfft = {0}; /* FFT object (fill zeros) */ int k; - memset(&pfft, 0, sizeof(fft_t)); // Заполняем FFT структуру нулями + /* Fill FFT structure */ + fft_create(&pfft, N); - fft_create(&pfft, N); // Создаем FFT структуру для длины N - - // заполняем массив входного сигнала + /* Fill input signal x[k] = exp(j*k) */ for(k = 0; k < N; k++) { RE(x[k]) = (double)cos((double)k); IM(x[k]) = (double)sin((double)k); } - fft_cmplx(x, N, &pfft, y); // FFT + /* FFT */ + fft_cmplx(x, N, &pfft, y); - // Печать результата + /* print result */ for(k = 0; k < N; k++) printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k])); - fft_free(&pfft); // Очищаем структуру fft_t - dspl_free(handle); // Очищаем dspl handle + fft_free(&pfft); /* Clear fft_t object */ + dspl_free(handle); /* Clear DSPL handle */ return 0; } - diff --git a/examples/src/fft_test.c b/examples/src/fft_test.c index 3b32c7a..08c7cc7 100644 --- a/examples/src/fft_test.c +++ b/examples/src/fft_test.c @@ -3,35 +3,37 @@ #include #include "dspl.h" +/* FFT size */ #define N 14 int main() { - void* handle; // DSPL handle - handle = dspl_load(); // Загрузка DSPL - - double x[N]; // массив входного сигнала - complex_t y[N]; // массив результата БПФ - fft_t pfft; // FFT объект + void* handle; /* DSPL handle */ + handle = dspl_load(); /* Load libdspl */ + double x[N]; /* Input signal array */ + complex_t y[N]; /* Output signal array */ + fft_t pfft = {0}; /* FFT object (fill zeros) */ int k; - memset(&pfft, 0, sizeof(fft_t)); // Заполняем FFT структуру нулями + + /* Fill FFT structure */ + fft_create(&pfft, N); - fft_create(&pfft, N); // Создаем FFT структуру для длины N - - // заполняем массив входного сигнала + /* Fill input signal x[k] = k */ for(k = 0; k < N; k++) x[k] = (double)k; - fft(x, N, &pfft, y); // FFT + /* FFT */ + fft(x, N, &pfft, y); - // Печать результата + /* print result */ for(k = 0; k < N; k++) printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k])); - fft_free(&pfft); // Очищаем структуру fft_t - dspl_free(handle); // Очищаем dspl handle + fft_free(&pfft); /* Clear fft_t object */ + dspl_free(handle); /* Clear DSPL handle */ return 0; } + diff --git a/examples/src/idft_cmplx_test.c b/examples/src/idft_cmplx_test.c index a05d23d..47c4165 100644 --- a/examples/src/idft_cmplx_test.c +++ b/examples/src/idft_cmplx_test.c @@ -7,28 +7,33 @@ int main() { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function - complex_t x[N]; // complex input signal - complex_t y[N]; // DFT - complex_t z[N]; // IDFT + void* handle; /* DSPL handle */ + handle = dspl_load(); /* Load DSPL function */ + complex_t x[N]; /* complex input signal */ + complex_t y[N]; /* DFT */ + complex_t z[N]; /* IDFT */ int k; + /* Fill input signal */ for(k = 0; k < N; k++) { RE(x[k]) = (double)k; IM(x[k]) = 0.0; } + /* DFT */ dft_cmplx(x,N,y); + + /* IDFT */ idft_cmplx(y,N,z); + /* print result */ for(k = 0; k < N; k++) printf("x[%2d] = %9.3f%+9.3fj, z[%2d] = %9.3f%+9.3f\n", k, RE(x[k]), IM(x[k]), k, RE(z[k]), IM(z[k])); - dspl_free(handle); // remember to free the resource + dspl_free(handle); /* remember to free the resource */ return 0; } diff --git a/examples/src/ifft_cmplx_test.c b/examples/src/ifft_cmplx_test.c index 9792273..939a3c7 100644 --- a/examples/src/ifft_cmplx_test.c +++ b/examples/src/ifft_cmplx_test.c @@ -7,38 +7,39 @@ int main() { - void* handle; // DSPL handle - handle = dspl_load(); // Загрузка DSPL - - complex_t x[N]; // массив входного сигнала - complex_t y[N]; // массив результата БПФ - complex_t z[N]; // массив результата ОБПФ - fft_t pfft; // FFT объект + void* handle; /* DSPL handle */ + handle = dspl_load(); /* Load libdspl */ + complex_t x[N]; /* Input signal array */ + complex_t y[N]; /* FFT Output signal array */ + complex_t z[N]; /* IFFT Output signal array */ + fft_t pfft = {0}; /* FFT object (fill zeros) */ int k; - - memset(&pfft, 0, sizeof(fft_t)); // Заполняем FFT структуру нулями - - fft_create(&pfft, N); // Создаем FFT структуру для длины N - - // заполняем массив входного сигнала + + /* Fill FFT structure */ + fft_create(&pfft, N); + + /* Fill input signal x[k] = exp(j*k) */ for(k = 0; k < N; k++) { RE(x[k]) = (double)cos((double)k); IM(x[k]) = (double)sin((double)k); } - fft_cmplx(x, N, &pfft, y); // FFT - - ifft_cmplx(y, N, &pfft, z); // IFFT - // Печать результата + /* FFT */ + fft_cmplx(x, N, &pfft, y); + + /* FFT */ + ifft_cmplx(y, N, &pfft, z); + + /* print result */ for(k = 0; k < N; k++) { printf("| x[%2d] = %9.3f%9.3f ", k, RE(x[k]), IM(x[k])); printf("| y[%2d] = %9.3f%9.3f ", k, RE(y[k]), IM(y[k])); printf("| z[%2d] = %9.3f%9.3f |\n", k, RE(z[k]), IM(z[k])); } - fft_free(&pfft); // Очищаем структуру fft_t - dspl_free(handle); // Очищаем dspl handle + fft_free(&pfft); /* Clear fft_t object */ + dspl_free(handle); /* Clear DSPL handle */ return 0; }