Merge branch 'feature/app_link_os_lib' into 'master'
Feature/app link os lib See merge request !7
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||||
<cconfiguration id="0.1571827594">
|
<cconfiguration id="0.1571827594">
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594" moduleId="org.eclipse.cdt.core.settings" name="Test stm32 Debug">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594" name="Test stm32 Debug" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594" name="Debug" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||||
<folderInfo id="0.1571827594." name="/" resourcePath="">
|
<folderInfo id="0.1571827594." name="/" resourcePath="">
|
||||||
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1042648408" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1042648408" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.1042648408.1242504024" name=""/>
|
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.1042648408.1242504024" name=""/>
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
</cconfiguration>
|
</cconfiguration>
|
||||||
<cconfiguration id="0.1571827594.511870544">
|
<cconfiguration id="0.1571827594.511870544">
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594.511870544" moduleId="org.eclipse.cdt.core.settings" name="Test stm32 Release">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594.511870544" moduleId="org.eclipse.cdt.core.settings" name="Release">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
@@ -62,11 +62,11 @@
|
|||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594.511870544" name="Test stm32 Release" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594.511870544" name="Release" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||||
<folderInfo id="0.1571827594.511870544." name="/" resourcePath="">
|
<folderInfo id="0.1571827594.511870544." name="/" resourcePath="">
|
||||||
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.541156446" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.541156446" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.541156446.585830490" name=""/>
|
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.541156446.585830490" name=""/>
|
||||||
<builder buildPath="${workspace_loc:/engine_control/source}" cleanBuildTarget="APP=test BOARD=stm32f4-discovery clean" id="org.eclipse.cdt.build.core.settings.default.builder.298702710" incrementalBuildTarget="APP=test BOARD=stm32f4-discovery all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
<builder buildPath="${workspace_loc:/engine_control}" cleanBuildTarget="BOARD=stm32f4-discovery clean" id="org.eclipse.cdt.build.core.settings.default.builder.298702710" incrementalBuildTarget="BOARD=stm32f4-discovery all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||||
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.232481989" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.232481989" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||||
<tool id="org.eclipse.cdt.build.core.settings.holder.562391475" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
<tool id="org.eclipse.cdt.build.core.settings.holder.562391475" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1491856129" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1491856129" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
@@ -103,12 +103,15 @@
|
|||||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||||
<configuration configurationName="Test stm32 Debug"/>
|
<configuration configurationName="Test stm32 Debug"/>
|
||||||
<configuration configurationName="ex_tx msp Debug"/>
|
<configuration configurationName="ex_tx msp Debug"/>
|
||||||
|
<configuration configurationName="Test stm32 Release"/>
|
||||||
<configuration configurationName="Default">
|
<configuration configurationName="Default">
|
||||||
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration configurationName="Test Stm Debug">
|
<configuration configurationName="Test Stm Debug">
|
||||||
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
<configuration configurationName="Debug"/>
|
||||||
|
<configuration configurationName="Release"/>
|
||||||
<configuration configurationName="Test msp Debug"/>
|
<configuration configurationName="Test msp Debug"/>
|
||||||
<configuration configurationName="ex_rx msp Debug"/>
|
<configuration configurationName="ex_rx msp Debug"/>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
@@ -127,84 +130,29 @@
|
|||||||
<scannerConfigBuildInfo instanceId="0.1571827594.174997613.1900689539.492450098">
|
<scannerConfigBuildInfo instanceId="0.1571827594.174997613.1900689539.492450098">
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
</scannerConfigBuildInfo>
|
</scannerConfigBuildInfo>
|
||||||
|
<scannerConfigBuildInfo instanceId="0.1571827594.511870544">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
||||||
<buildTargets>
|
<buildTargets>
|
||||||
<target name="msp430-ccrf example_radio_rx all" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="debug all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
<buildArguments>BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>all</buildTarget>
|
<buildTarget>all</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="msp430-ccrf example_radio_rx clean" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="debug clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="msp430-ccrf example_radio_rx install" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>install</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="all" path="software/source/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="clean" path="software/source/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="all" path="software/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="all" path="software/source/test/firmware/kernel/ringbuffer" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="clean" path="software/source/test/firmware/kernel/ringbuffer" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="distclean" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>distclean</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="test all" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments> APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments> APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>all</buildTarget>
|
<buildTarget>clean</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="test install" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="debug install" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments>APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>install</buildTarget>
|
<buildTarget>install</buildTarget>
|
||||||
@@ -212,62 +160,38 @@
|
|||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="test clean" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="distclean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments> APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="distclean" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments/>
|
<buildArguments/>
|
||||||
<buildTarget>distclean</buildTarget>
|
<buildTarget>distclean</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="test all" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="release all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments> APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments> APP=test BOARD=stm32f4-discovery</buildArguments>
|
||||||
<buildTarget>all</buildTarget>
|
<buildTarget>all</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="test install" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="release clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments> APP=test BOARD=stm32f4-discovery</buildArguments>
|
||||||
<buildTarget>install</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="example_semaphore install" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>install</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="example_semaphore all" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="example_semaphore clean" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>clean</buildTarget>
|
<buildTarget>clean</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
|
<target name="release install" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=test BOARD=stm32f4-discovery</buildArguments>
|
||||||
|
<buildTarget>install</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
</buildTargets>
|
</buildTargets>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
</cproject>
|
</cproject>
|
||||||
|
|||||||
+3
-6
@@ -22,22 +22,19 @@ stages:
|
|||||||
|
|
||||||
build_job:
|
build_job:
|
||||||
script:
|
script:
|
||||||
- "cd source"
|
- "make all APP=test BOARD=stm32f4-discovery DEBUG=y"
|
||||||
- "make all APP=test BOARD=stm32f4-discovery"
|
|
||||||
stage: build
|
stage: build
|
||||||
except:
|
except:
|
||||||
- /^release/.*$/
|
- /^release/.*$/
|
||||||
|
|
||||||
check_job:
|
check_job:
|
||||||
script:
|
script:
|
||||||
- "cd source"
|
- "make check APP=test BOARD=stm32f4-discovery DEBUG=y"
|
||||||
- "make check APP=test BOARD=stm32f4-discovery"
|
|
||||||
stage: check
|
stage: check
|
||||||
|
|
||||||
test_job:
|
test_job:
|
||||||
script:
|
script:
|
||||||
- "cd source"
|
- "make install APP=test BOARD=stm32f4-discovery DEBUG=y"
|
||||||
- "make install APP=test BOARD=stm32f4-discovery"
|
|
||||||
stage: test
|
stage: test
|
||||||
|
|
||||||
#int_release_job:
|
#int_release_job:
|
||||||
|
|||||||
+11
-13
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
include ../config/make/rules.mk
|
include config/make/rules.mk
|
||||||
|
|
||||||
MAINFILE = $(EXE_DIR)/$(APP)$(ELF_EXT)
|
MAINFILE = $(EXE_DIR)/$(APP)$(ELF_EXT)
|
||||||
BINFILE = $(EXE_DIR)/$(APP)$(BIN_EXT)
|
BINFILE = $(EXE_DIR)/$(APP)$(BIN_EXT)
|
||||||
@@ -16,17 +16,16 @@ CHECK_FOLDER :=
|
|||||||
SOURCES := $(wildcard $(SRC_DIR)/*.c)
|
SOURCES := $(wildcard $(SRC_DIR)/*.c)
|
||||||
ASM_SOURCES := $(wildcard $(SRC_DIR)/*.s)
|
ASM_SOURCES := $(wildcard $(SRC_DIR)/*.s)
|
||||||
|
|
||||||
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
OBJECTS = $(SOURCES:$(ROOT_DIR)/%.c=$(OBJ_DIR)/%.o)
|
||||||
ASM_OBJECTS = $(ASMSOURCES:$(SRC_DIR)/%.s=$(OBJ_DIR)/%.o)
|
ASM_OBJECTS = $(ASMSOURCES:$(ROOT_DIR)/%.s=$(OBJ_DIR)/%.o)
|
||||||
DEPS = $(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.d)
|
DEPS = $(SOURCES:$(ROOT_DIR)/%.c=$(OBJ_DIR)/%.d)
|
||||||
|
|
||||||
#include subfolders
|
#include subfolders
|
||||||
include application/application.mk
|
include source/application/application.mk
|
||||||
include firmware/firmware.mk
|
|
||||||
|
|
||||||
SOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(SRC_DIR)/$(folder)/*.c))
|
SOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.c))
|
||||||
CHECKSOURCES += $(foreach folder, $(CHECK_FOLDER), $(wildcard $(SRC_DIR)/$(folder)/*.c))
|
CHECKSOURCES += $(foreach folder, $(CHECK_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.c))
|
||||||
ASMSOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(SRC_DIR)/$(folder)/*.s))
|
ASMSOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.s))
|
||||||
|
|
||||||
all: check $(MAINFILE)
|
all: check $(MAINFILE)
|
||||||
|
|
||||||
@@ -38,7 +37,7 @@ $(MAINFILE): $(OBJECTS) $(ASM_OBJECTS)
|
|||||||
@$(MKDIR) $(EXE_DIR)
|
@$(MKDIR) $(EXE_DIR)
|
||||||
@$(MKDIR) $(MAP_DIR)
|
@$(MKDIR) $(MAP_DIR)
|
||||||
@$(MKDIR) $(SIZE_DIR)
|
@$(MKDIR) $(SIZE_DIR)
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(ASM_OBJECTS) -o $(MAINFILE)
|
$(CC) $(CFLAGS) -L$(LIB_DIR) $(LDFLAGS) -o $(MAINFILE) $(OBJECTS) $(ASM_OBJECTS) $(addprefix -l, $(LIBS))
|
||||||
$(OBJCOPY) $(MAINFILE) -O binary $(BINFILE)
|
$(OBJCOPY) $(MAINFILE) -O binary $(BINFILE)
|
||||||
$(OBJCOPY) $(MAINFILE) -O ihex $(HEXFILE)
|
$(OBJCOPY) $(MAINFILE) -O ihex $(HEXFILE)
|
||||||
$(NM) --size-sort --print-size $(MAINFILE) > $(SIZEFILE)
|
$(NM) --size-sort --print-size $(MAINFILE) > $(SIZEFILE)
|
||||||
@@ -46,14 +45,13 @@ $(MAINFILE): $(OBJECTS) $(ASM_OBJECTS)
|
|||||||
@$(SIZE) --format=berkeley -x $(MAINFILE)
|
@$(SIZE) --format=berkeley -x $(MAINFILE)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
$(OBJ_DIR)/%.o: $(ROOT_DIR)/%.c
|
||||||
@rm -rf $(LIB)
|
|
||||||
@$(MKDIR) $(OBJ_DIR)
|
@$(MKDIR) $(OBJ_DIR)
|
||||||
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
||||||
$(call makedep,$<,$@,$(subst .o,.d,$@))
|
$(call makedep,$<,$@,$(subst .o,.d,$@))
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.s
|
$(OBJ_DIR)/%.o: $(ROOT_DIR)/%.s
|
||||||
@$(MKDIR) $(OBJ_DIR)
|
@$(MKDIR) $(OBJ_DIR)
|
||||||
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
+14
-13
@@ -2,15 +2,17 @@
|
|||||||
|
|
||||||
ROOT_DIR := $(shell pwd | sed "s/\/source//g")
|
ROOT_DIR := $(shell pwd | sed "s/\/source//g")
|
||||||
|
|
||||||
ifeq ($(BOARD), msp430-ccrf)
|
|
||||||
include $(ROOT_DIR)/config/make/msp430.mk
|
|
||||||
endif
|
|
||||||
ifeq ($(BOARD), stm32f4-discovery)
|
ifeq ($(BOARD), stm32f4-discovery)
|
||||||
include $(ROOT_DIR)/config/make/stm32f4xx.mk
|
include $(ROOT_DIR)/config/make/stm32f4xx.mk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
INCLUDES += $(SRC_DIR)/os/$(DBG_REL_DIR)/include
|
||||||
|
LIB_DIR += $(SRC_DIR)/os/$(DBG_REL_DIR)
|
||||||
|
|
||||||
|
OS_LIB = kosmos-$(ARCH)-$(BOARD)$(DBG_EXT)
|
||||||
|
LIBS += $(OS_LIB)
|
||||||
|
|
||||||
CFLAGS += \
|
CFLAGS += \
|
||||||
-Wno-unused-function \
|
|
||||||
-O$(OPTIM) \
|
-O$(OPTIM) \
|
||||||
$(addprefix -I, $(INCLUDES)) \
|
$(addprefix -I, $(INCLUDES)) \
|
||||||
-Wall
|
-Wall
|
||||||
@@ -25,17 +27,15 @@ CPPCHECK_FLAGS += \
|
|||||||
include $(ROOT_DIR)/config/make/tools.mk
|
include $(ROOT_DIR)/config/make/tools.mk
|
||||||
|
|
||||||
SRC_DIR = $(ROOT_DIR)/source
|
SRC_DIR = $(ROOT_DIR)/source
|
||||||
|
DBG_REL_DIR = release
|
||||||
ifeq ($(DEBUG),y)
|
ifeq ($(DEBUG),y)
|
||||||
OBJ_DIR = $(ROOT_DIR)/release/object/$(ARCH)/debug
|
DBG_REL_DIR = debug
|
||||||
EXE_DIR = $(ROOT_DIR)/release/execute/$(ARCH)/debug
|
|
||||||
MAP_DIR = $(ROOT_DIR)/release/map/$(ARCH)/debug
|
|
||||||
SIZE_DIR = $(ROOT_DIR)/release/size/$(ARCH)/debug
|
|
||||||
else
|
|
||||||
OBJ_DIR = $(ROOT_DIR)/release/object/$(ARCH)/release
|
|
||||||
EXE_DIR = $(ROOT_DIR)/release/execute/$(ARCH)/release
|
|
||||||
MAP_DIR = $(ROOT_DIR)/release/map/$(ARCH)/release
|
|
||||||
SIZE_DIR = $(ROOT_DIR)/release/size/$(ARCH)/release
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
OBJ_DIR = $(ROOT_DIR)/release/object/$(ARCH)/$(DBG_REL_DIR)
|
||||||
|
EXE_DIR = $(ROOT_DIR)/release/execute/$(ARCH)/$(DBG_REL_DIR)
|
||||||
|
MAP_DIR = $(ROOT_DIR)/release/map/$(ARCH)/$(DBG_REL_DIR)
|
||||||
|
SIZE_DIR = $(ROOT_DIR)/release/size/$(ARCH)/$(DBG_REL_DIR)
|
||||||
DOC_DIR = $(ROOT_DIR)/doc/$(ARCH)
|
DOC_DIR = $(ROOT_DIR)/doc/$(ARCH)
|
||||||
TEST_OBJ_DIR = $(ROOT_DIR)/test/object
|
TEST_OBJ_DIR = $(ROOT_DIR)/test/object
|
||||||
TEST_EXE_DIR = $(ROOT_DIR)/test/execute/
|
TEST_EXE_DIR = $(ROOT_DIR)/test/execute/
|
||||||
@@ -45,6 +45,7 @@ DOC_SRC :=
|
|||||||
ELF_EXT = .elf
|
ELF_EXT = .elf
|
||||||
BIN_EXT = .bin
|
BIN_EXT = .bin
|
||||||
HEX_EXT = .hex
|
HEX_EXT = .hex
|
||||||
|
LIB_EXT = .a
|
||||||
SIZE_EXT = .size
|
SIZE_EXT = .size
|
||||||
TEST_EXT =
|
TEST_EXT =
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
ARCH ?= stm32f4xx
|
ARCH ?= arm
|
||||||
|
CPU ?= stm32f4xx
|
||||||
ifeq ($(ARCH),stm32f4xx)
|
ifeq ($(ARCH),stm32f4xx)
|
||||||
CFLAGS += -DARCH_STM32F4XX
|
CFLAGS += -DARCH_STM32F4XX
|
||||||
endif
|
endif
|
||||||
@@ -14,14 +15,16 @@ INCLUDES += \
|
|||||||
ifeq ($(DEBUG),y)
|
ifeq ($(DEBUG),y)
|
||||||
OPTIM = 0
|
OPTIM = 0
|
||||||
CFLAGS += -g
|
CFLAGS += -g
|
||||||
|
DBG_EXT = -dbg
|
||||||
else
|
else
|
||||||
OPTIM = s
|
OPTIM = s
|
||||||
LDFLAGS += -s
|
LDFLAGS += -s
|
||||||
|
DBG_EXT =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += \
|
CFLAGS += \
|
||||||
-mthumb \
|
-mthumb \
|
||||||
-T $(ROOT_DIR)/source/firmware/arch/stm32f4xx/linker/stm32_flash.ld \
|
-T $(ROOT_DIR)/config/linker/stm32_flash.ld \
|
||||||
-D USE_STDPERIPH_DRIVER\
|
-D USE_STDPERIPH_DRIVER\
|
||||||
-D VECT_TAB_FLASH\
|
-D VECT_TAB_FLASH\
|
||||||
-D GCC_ARMCM4\
|
-D GCC_ARMCM4\
|
||||||
|
|||||||
@@ -1,9 +1,4 @@
|
|||||||
INCLUDES += application
|
CHECK_FOLDER += source/application
|
||||||
DOC_SRC += application
|
SUB_FOLDER += source/application
|
||||||
|
INCLUDES += source/application
|
||||||
ifeq ($(APP), example_semaphore)
|
DOC_SRC += source/application
|
||||||
include application/example_semaphore/example_semaphore.mk
|
|
||||||
endif
|
|
||||||
ifeq ($(APP), test)
|
|
||||||
include application/test/test.mk
|
|
||||||
endif
|
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
CHECK_FOLDER += application/example_semaphore
|
|
||||||
SUB_FOLDER += application/example_semaphore
|
|
||||||
INCLUDES += application/example_semaphore
|
|
||||||
DOC_SRC += application/example_semaphore
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
#include "ctx.h"
|
|
||||||
#include "stack.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "thread.h"
|
|
||||||
#include "schedule.h"
|
|
||||||
#include "isr.h"
|
|
||||||
#include "sys_tick.h"
|
|
||||||
#include "semaphore.h"
|
|
||||||
|
|
||||||
#define STACK_SIZE 256
|
|
||||||
static stack_t tc_1_stack[STACK_SIZE];
|
|
||||||
static struct thread_context tc_1;
|
|
||||||
static stack_t tc_2_stack[STACK_SIZE];
|
|
||||||
static struct thread_context tc_2;
|
|
||||||
|
|
||||||
static struct semaphore sem;
|
|
||||||
|
|
||||||
void task2(void *arg)
|
|
||||||
{
|
|
||||||
gpio_open(&led_1);
|
|
||||||
gpio_write(&led_1, 0);
|
|
||||||
while(1) {
|
|
||||||
semaphore_wait(&sem);
|
|
||||||
gpio_toggle(&led_1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void task1(void *arg)
|
|
||||||
{
|
|
||||||
while(1) {
|
|
||||||
sleep_ms(3000);
|
|
||||||
semaphore_post(&sem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
board_init();
|
|
||||||
sys_tick_init(&timer_1);
|
|
||||||
|
|
||||||
semaphore_init( &sem, 0);
|
|
||||||
|
|
||||||
thread_create(&tc_1, tc_1_stack, STACK_SIZE, task1, NULL, THREAD_PRIO_LOW);
|
|
||||||
thread_create(&tc_2, tc_2_stack, STACK_SIZE, task2, NULL, THREAD_PRIO_LOW);
|
|
||||||
schedule_start();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -4,15 +4,11 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "board.h"
|
#include "driver.h"
|
||||||
#include "ctx.h"
|
#include "board_devices.h"
|
||||||
#include "stack.h"
|
#include "stack.h"
|
||||||
#include "queue.h"
|
#include "queue.h"
|
||||||
#include "thread.h"
|
#include "kernel.h"
|
||||||
#include "schedule.h"
|
|
||||||
#include "isr.h"
|
|
||||||
#include "sys_tick.h"
|
|
||||||
|
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
|
|
||||||
#define STACK_SIZE 256
|
#define STACK_SIZE 256
|
||||||
@@ -51,8 +47,6 @@ stack_t tc_2_stack[STACK_SIZE];
|
|||||||
struct thread_context tc_2;
|
struct thread_context tc_2;
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
board_init();
|
|
||||||
sys_tick_init(&timer_1);
|
|
||||||
open(&uart_1);
|
open(&uart_1);
|
||||||
thread_create(&tc_1, tc_1_stack, STACK_SIZE, task1, NULL, THREAD_PRIO_LOW);
|
thread_create(&tc_1, tc_1_stack, STACK_SIZE, task1, NULL, THREAD_PRIO_LOW);
|
||||||
thread_create(&tc_2, tc_2_stack, STACK_SIZE, task2, NULL, THREAD_PRIO_LOW);
|
thread_create(&tc_2, tc_2_stack, STACK_SIZE, task2, NULL, THREAD_PRIO_LOW);
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
CHECK_FOLDER += application/test
|
|
||||||
SUB_FOLDER += application/test
|
|
||||||
INCLUDES += application/test
|
|
||||||
DOC_SRC += application/test
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
ifeq ($(ARCH), stm32f4xx)
|
|
||||||
include firmware/arch/stm32f4xx/stm32f4xx.mk
|
|
||||||
endif
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "usbd_cdc_vcp.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Transmit a char, if you want to use printf(),
|
|
||||||
* you need implement this function
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param c Character to write.
|
|
||||||
*/
|
|
||||||
void PrintChar(char c) {
|
|
||||||
/* Send a char like:
|
|
||||||
while(Transfer not completed);
|
|
||||||
Transmit a char;
|
|
||||||
*/
|
|
||||||
USB_VCOM_Send( &c, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Implementation of fputs using the DBGU as the standard output. Required
|
|
||||||
* for printf().
|
|
||||||
*
|
|
||||||
* @param pStr String to write.
|
|
||||||
* @param pStream Output stream.
|
|
||||||
*
|
|
||||||
* @return Number of characters written if successful, or -1 if the output
|
|
||||||
* stream is not stdout or stderr.
|
|
||||||
*/
|
|
||||||
signed int fputs(const char *pStr, FILE *pStream)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
signed int num = 0;
|
|
||||||
while (*pStr != 0) {
|
|
||||||
if (fputc(*pStr, pStream) == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
num++;
|
|
||||||
pStr++;
|
|
||||||
}
|
|
||||||
return num;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
USB_VCOM_Send((char*)pStr, strlen(pStr));
|
|
||||||
return strlen(pStr);
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
/*
|
|
||||||
* print.h
|
|
||||||
*
|
|
||||||
* Created on: May 22, 2012
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef PRINT_H_
|
|
||||||
#define PRINT_H_
|
|
||||||
|
|
||||||
void PrintChar(char c);
|
|
||||||
|
|
||||||
#endif /* PRINT_H_ */
|
|
||||||
@@ -1,513 +0,0 @@
|
|||||||
/**************************************************************************//*****
|
|
||||||
* @file printf.c
|
|
||||||
* @brief Implementation of several stdio.h methods, such as printf(),
|
|
||||||
* sprintf() and so on. This reduces the memory footprint of the
|
|
||||||
* binary when using those methods, compared to the libc implementation.
|
|
||||||
********************************************************************************/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "print.h"
|
|
||||||
|
|
||||||
/** Maximum string size allowed (in bytes). */
|
|
||||||
#define MAX_STRING_SIZE 100
|
|
||||||
|
|
||||||
|
|
||||||
/** Required for proper compilation. */
|
|
||||||
struct _reent r = {0, (FILE *) 0, (FILE *) 1, (FILE *) 0};
|
|
||||||
//struct _reent *_impure_ptr = &r;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a character inside the given string. Returns 1.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param c Character to write.
|
|
||||||
*/
|
|
||||||
signed int PutChar(char *pStr, char c)
|
|
||||||
{
|
|
||||||
*pStr = c;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a string inside the given string.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param pSource Source string.
|
|
||||||
* @return The size of the written
|
|
||||||
*/
|
|
||||||
signed int PutString(char *pStr, const char *pSource)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
|
|
||||||
while (*pSource != 0) {
|
|
||||||
|
|
||||||
*pStr++ = *pSource++;
|
|
||||||
num++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes an unsigned int inside the given string, using the provided fill &
|
|
||||||
* width parameters.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param fill Fill character.
|
|
||||||
* @param width Minimum integer width.
|
|
||||||
* @param value Integer value.
|
|
||||||
*/
|
|
||||||
signed int PutUnsignedInt(
|
|
||||||
char *pStr,
|
|
||||||
char fill,
|
|
||||||
signed int width,
|
|
||||||
unsigned int value)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
|
|
||||||
/* Take current digit into account when calculating width */
|
|
||||||
width--;
|
|
||||||
|
|
||||||
/* Recursively write upper digits */
|
|
||||||
if ((value / 10) > 0) {
|
|
||||||
|
|
||||||
num = PutUnsignedInt(pStr, fill, width, value / 10);
|
|
||||||
pStr += num;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write filler characters */
|
|
||||||
else {
|
|
||||||
|
|
||||||
while (width > 0) {
|
|
||||||
|
|
||||||
PutChar(pStr, fill);
|
|
||||||
pStr++;
|
|
||||||
num++;
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write lower digit */
|
|
||||||
num += PutChar(pStr, (value % 10) + '0');
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a signed int inside the given string, using the provided fill & width
|
|
||||||
* parameters.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param fill Fill character.
|
|
||||||
* @param width Minimum integer width.
|
|
||||||
* @param value Signed integer value.
|
|
||||||
*/
|
|
||||||
signed int PutSignedInt(
|
|
||||||
char *pStr,
|
|
||||||
char fill,
|
|
||||||
signed int width,
|
|
||||||
signed int value)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
unsigned int absolute;
|
|
||||||
|
|
||||||
/* Compute absolute value */
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
absolute = -value;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
absolute = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Take current digit into account when calculating width */
|
|
||||||
width--;
|
|
||||||
|
|
||||||
/* Recursively write upper digits */
|
|
||||||
if ((absolute / 10) > 0) {
|
|
||||||
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
num = PutSignedInt(pStr, fill, width, -(absolute / 10));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
num = PutSignedInt(pStr, fill, width, absolute / 10);
|
|
||||||
}
|
|
||||||
pStr += num;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
/* Reserve space for sign */
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write filler characters */
|
|
||||||
while (width > 0) {
|
|
||||||
|
|
||||||
PutChar(pStr, fill);
|
|
||||||
pStr++;
|
|
||||||
num++;
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write sign */
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
num += PutChar(pStr, '-');
|
|
||||||
pStr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write lower digit */
|
|
||||||
num += PutChar(pStr, (absolute % 10) + '0');
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes an hexadecimal value into a string, using the given fill, width &
|
|
||||||
* capital parameters.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param fill Fill character.
|
|
||||||
* @param width Minimum integer width.
|
|
||||||
* @param maj Indicates if the letters must be printed in lower- or upper-case.
|
|
||||||
* @param value Hexadecimal value.
|
|
||||||
*
|
|
||||||
* @return The number of char written
|
|
||||||
*/
|
|
||||||
signed int PutHexa(
|
|
||||||
char *pStr,
|
|
||||||
char fill,
|
|
||||||
signed int width,
|
|
||||||
unsigned char maj,
|
|
||||||
unsigned int value)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
|
|
||||||
/* Decrement width */
|
|
||||||
width--;
|
|
||||||
|
|
||||||
/* Recursively output upper digits */
|
|
||||||
if ((value >> 4) > 0) {
|
|
||||||
|
|
||||||
num += PutHexa(pStr, fill, width, maj, value >> 4);
|
|
||||||
pStr += num;
|
|
||||||
}
|
|
||||||
/* Write filler chars */
|
|
||||||
else {
|
|
||||||
|
|
||||||
while (width > 0) {
|
|
||||||
|
|
||||||
PutChar(pStr, fill);
|
|
||||||
pStr++;
|
|
||||||
num++;
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write current digit */
|
|
||||||
if ((value & 0xF) < 10) {
|
|
||||||
|
|
||||||
PutChar(pStr, (value & 0xF) + '0');
|
|
||||||
}
|
|
||||||
else if (maj) {
|
|
||||||
|
|
||||||
PutChar(pStr, (value & 0xF) - 10 + 'A');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
PutChar(pStr, (value & 0xF) - 10 + 'a');
|
|
||||||
}
|
|
||||||
num++;
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Global Functions ----------------------------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stores the result of a formatted string into another string. Format
|
|
||||||
* arguments are given in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pStr Destination string.
|
|
||||||
* @param length Length of Destination string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ap Argument list.
|
|
||||||
*
|
|
||||||
* @return The number of characters written.
|
|
||||||
*/
|
|
||||||
signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
char fill;
|
|
||||||
unsigned char width;
|
|
||||||
signed int num = 0;
|
|
||||||
signed int size = 0;
|
|
||||||
|
|
||||||
/* Clear the string */
|
|
||||||
if (pStr) {
|
|
||||||
|
|
||||||
*pStr = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Phase string */
|
|
||||||
while (*pFormat != 0 && size < length) {
|
|
||||||
|
|
||||||
/* Normal character */
|
|
||||||
if (*pFormat != '%') {
|
|
||||||
|
|
||||||
*pStr++ = *pFormat++;
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
/* Escaped '%' */
|
|
||||||
else if (*(pFormat+1) == '%') {
|
|
||||||
|
|
||||||
*pStr++ = '%';
|
|
||||||
pFormat += 2;
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
/* Token delimiter */
|
|
||||||
else {
|
|
||||||
|
|
||||||
fill = ' ';
|
|
||||||
width = 0;
|
|
||||||
pFormat++;
|
|
||||||
|
|
||||||
/* Parse filler */
|
|
||||||
if (*pFormat == '0') {
|
|
||||||
|
|
||||||
fill = '0';
|
|
||||||
pFormat++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse width */
|
|
||||||
while ((*pFormat >= '0') && (*pFormat <= '9')) {
|
|
||||||
|
|
||||||
width = (width*10) + *pFormat-'0';
|
|
||||||
pFormat++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if there is enough space */
|
|
||||||
if (size + width > length) {
|
|
||||||
|
|
||||||
width = length - size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse type */
|
|
||||||
switch (*pFormat) {
|
|
||||||
case 'd':
|
|
||||||
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
|
|
||||||
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
|
|
||||||
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
|
|
||||||
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
|
|
||||||
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
|
|
||||||
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
|
|
||||||
default:
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
pFormat++;
|
|
||||||
pStr += num;
|
|
||||||
size += num;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NULL-terminated (final \0 is not counted) */
|
|
||||||
if (size < length) {
|
|
||||||
|
|
||||||
*pStr = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
*(--pStr) = 0;
|
|
||||||
size--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stores the result of a formatted string into another string. Format
|
|
||||||
* arguments are given in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pStr Destination string.
|
|
||||||
* @param length Length of Destination string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ... Other arguments
|
|
||||||
*
|
|
||||||
* @return The number of characters written.
|
|
||||||
*/
|
|
||||||
signed int snprintf(char *pString, size_t length, const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int rc;
|
|
||||||
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
rc = vsnprintf(pString, length, pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stores the result of a formatted string into another string. Format
|
|
||||||
* arguments are given in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pString Destination string.
|
|
||||||
* @param length Length of Destination string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ap Argument list.
|
|
||||||
*
|
|
||||||
* @return The number of characters written.
|
|
||||||
*/
|
|
||||||
signed int vsprintf(char *pString, const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the given stream. Format arguments are given
|
|
||||||
* in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pStream Output stream.
|
|
||||||
* @param pFormat Format string
|
|
||||||
* @param ap Argument list.
|
|
||||||
*/
|
|
||||||
signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
char pStr[MAX_STRING_SIZE];
|
|
||||||
char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";
|
|
||||||
|
|
||||||
/* Write formatted string in buffer */
|
|
||||||
if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {
|
|
||||||
|
|
||||||
fputs(pError, stderr);
|
|
||||||
while (1); /* Increase MAX_STRING_SIZE */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Display string */
|
|
||||||
return fputs(pStr, pStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the DBGU stream. Format arguments are given
|
|
||||||
* in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ap Argument list.
|
|
||||||
*/
|
|
||||||
signed int vprintf(const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
return vfprintf(stdout, pFormat, ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the given stream, using a variable
|
|
||||||
* number of arguments.
|
|
||||||
*
|
|
||||||
* @param pStream Output stream.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
*/
|
|
||||||
signed int fprintf(FILE *pStream, const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int result;
|
|
||||||
|
|
||||||
/* Forward call to vfprintf */
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
result = vfprintf(pStream, pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the DBGU stream, using a variable number of
|
|
||||||
* arguments.
|
|
||||||
*
|
|
||||||
* @param pFormat Format string.
|
|
||||||
*/
|
|
||||||
signed int printf(const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int result;
|
|
||||||
|
|
||||||
/* Forward call to vprintf */
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
result = vprintf(pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a formatted string inside another string.
|
|
||||||
*
|
|
||||||
* @param pStr torage string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
*/
|
|
||||||
signed int sprintf(char *pStr, const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int result;
|
|
||||||
|
|
||||||
// Forward call to vsprintf
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
result = vsprintf(pStr, pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a string on stdout.
|
|
||||||
*
|
|
||||||
* @param pStr String to output.
|
|
||||||
*/
|
|
||||||
signed int puts(const char *pStr)
|
|
||||||
{
|
|
||||||
return fputs(pStr, stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Implementation of fputc using the DBGU as the standard output. Required
|
|
||||||
* for printf().
|
|
||||||
*
|
|
||||||
* @param c Character to write.
|
|
||||||
* @param pStream Output stream.
|
|
||||||
* @param The character written if successful, or -1 if the output stream is
|
|
||||||
* not stdout or stderr.
|
|
||||||
*/
|
|
||||||
signed int fputc(signed int c, FILE *pStream)
|
|
||||||
{
|
|
||||||
if ((pStream == stdout) || (pStream == stderr)) {
|
|
||||||
|
|
||||||
PrintChar(c);
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
/*! \file board.h
|
|
||||||
* \author tkl
|
|
||||||
* \date Feb 13, 2012
|
|
||||||
* \brief Header file of the board distributor.
|
|
||||||
*/
|
|
||||||
#ifndef BOARD_H_
|
|
||||||
#define BOARD_H_
|
|
||||||
|
|
||||||
#ifdef BOARD_STM32F4_DISCOVERY
|
|
||||||
#include "bsp_stm32f4-discovery.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* BOARD_H_ */
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
INCLUDES += firmware/arch/stm32f4xx/board
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/board
|
|
||||||
|
|
||||||
ifeq ($(BOARD), stm32f4-discovery)
|
|
||||||
include firmware/arch/stm32f4xx/board/stm32f4-discovery/stm32f4-discovery.mk
|
|
||||||
endif
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/*
|
|
||||||
* bsp_stm32f4-discovery.c
|
|
||||||
*
|
|
||||||
* Created on: May 7, 2012
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "bsp_stm32f4-discovery.h"
|
|
||||||
#if 0
|
|
||||||
#include "usbd_cdc_vcp.h"
|
|
||||||
|
|
||||||
volatile int32_t ITM_RxBuffer;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void board_init(void) {
|
|
||||||
SystemInit();
|
|
||||||
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
|
|
||||||
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
|
||||||
SysTick_CLKSourceConfig(RCC_SYSCLKSource_PLLCLK);
|
|
||||||
|
|
||||||
// USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb);
|
|
||||||
}
|
|
||||||
-244
@@ -1,244 +0,0 @@
|
|||||||
/*! \file bsp_stm32f4-discovery.h
|
|
||||||
* \author tkl
|
|
||||||
* \date Mai 7, 2012
|
|
||||||
* \brief Header file of the board definition for the STM32F4-Discovery board.
|
|
||||||
*/
|
|
||||||
#ifndef BSP_STM32F4_DISCOVERY_H_
|
|
||||||
#define BSP_STM32F4_DISCOVERY_H_
|
|
||||||
|
|
||||||
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "driver.h"
|
|
||||||
#include "gpio.h"
|
|
||||||
#include "uart.h"
|
|
||||||
#include "ringbuffer.h"
|
|
||||||
#include "stm32f4xx.h"
|
|
||||||
#include "stm32f4_gpio.h"
|
|
||||||
#include "stm32f4_uart.h"
|
|
||||||
#include "stm32_sys_tick.h"
|
|
||||||
|
|
||||||
// SYSTEM TICK
|
|
||||||
static const enum stm32_sys_tick_time_base stm23_sys_tick_time_base =
|
|
||||||
STM32_SYS_TICK_TIME_BASE_MS;
|
|
||||||
static const struct stm32_sys_tick stm32_sys_tick = {
|
|
||||||
&stm23_sys_tick_time_base,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct loki_timer timer_1 = {
|
|
||||||
(void*)&stm32_sys_tick,
|
|
||||||
&timer_fp
|
|
||||||
};
|
|
||||||
|
|
||||||
static char console_linear_buffer[80];
|
|
||||||
static struct ringbuffer console_buffer = {
|
|
||||||
console_linear_buffer,
|
|
||||||
console_linear_buffer,
|
|
||||||
console_linear_buffer,
|
|
||||||
sizeof(console_linear_buffer),
|
|
||||||
0
|
|
||||||
};
|
|
||||||
static const GPIO_InitTypeDef stm32f4_discovery_uart1_gpio = {
|
|
||||||
GPIO_Pin_6 | GPIO_Pin_7,
|
|
||||||
GPIO_Mode_AF,
|
|
||||||
GPIO_Speed_50MHz,
|
|
||||||
GPIO_OType_PP,
|
|
||||||
GPIO_PuPd_UP
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USART_InitTypeDef stm32f4_discovery_uart1_usart_init = {
|
|
||||||
115200,
|
|
||||||
USART_WordLength_8b,
|
|
||||||
USART_StopBits_1,
|
|
||||||
USART_Parity_No,
|
|
||||||
USART_Mode_Tx | USART_Mode_Rx,
|
|
||||||
USART_HardwareFlowControl_None,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const NVIC_InitTypeDef stm32f4_discovery_uart1_nvic_init = {
|
|
||||||
USART1_IRQn,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
ENABLE,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct stm32f4_uart stm32f4_uart1 = {
|
|
||||||
&stm32f4_discovery_uart1_gpio,
|
|
||||||
GPIOB,
|
|
||||||
GPIO_PinSource7,
|
|
||||||
GPIO_PinSource6,
|
|
||||||
&stm32f4_discovery_uart1_usart_init,
|
|
||||||
USART1,
|
|
||||||
USART_IT_RXNE /* | USART_IT_TXE*/,
|
|
||||||
&stm32f4_discovery_uart1_nvic_init,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct uart __uart_1 = {
|
|
||||||
&stm32f4_uart1,
|
|
||||||
&stm32f4_uart_fp,
|
|
||||||
&console_buffer,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct driver uart_1 = {
|
|
||||||
DRIVER_TYPE_UART,
|
|
||||||
&__uart_1,
|
|
||||||
};
|
|
||||||
|
|
||||||
// LED 3
|
|
||||||
static const GPIO_InitTypeDef stm32_f4_discovery_led_3_gpio = {
|
|
||||||
GPIO_Pin_12,
|
|
||||||
GPIO_Mode_OUT,
|
|
||||||
GPIO_Speed_100MHz,
|
|
||||||
GPIO_OType_PP,
|
|
||||||
GPIO_PuPd_NOPULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct stm32f4_gpio stm32_f4_discovery_led_3 = {
|
|
||||||
GPIOD,
|
|
||||||
&stm32_f4_discovery_led_3_gpio,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct gpio __led_3 = {
|
|
||||||
(void*)&stm32_f4_discovery_led_3,
|
|
||||||
&gpio_fp
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct driver led_3 = {
|
|
||||||
DRIVER_TYPE_GPIO,
|
|
||||||
&__led_3,
|
|
||||||
};
|
|
||||||
|
|
||||||
// LED 4
|
|
||||||
static const GPIO_InitTypeDef stm32_f4_discovery_led_4_gpio = {
|
|
||||||
GPIO_Pin_13,
|
|
||||||
GPIO_Mode_OUT,
|
|
||||||
GPIO_Speed_100MHz,
|
|
||||||
GPIO_OType_PP,
|
|
||||||
GPIO_PuPd_NOPULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct stm32f4_gpio stm32_f4_discovery_led_4 = {
|
|
||||||
GPIOD,
|
|
||||||
&stm32_f4_discovery_led_4_gpio,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct gpio __led_4 = {
|
|
||||||
(void*)&stm32_f4_discovery_led_4,
|
|
||||||
&gpio_fp
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct driver led_4 = {
|
|
||||||
DRIVER_TYPE_GPIO,
|
|
||||||
&__led_4,
|
|
||||||
};
|
|
||||||
|
|
||||||
// LED 5
|
|
||||||
static const GPIO_InitTypeDef stm32_f4_discovery_led_5_gpio = {
|
|
||||||
GPIO_Pin_14,
|
|
||||||
GPIO_Mode_OUT,
|
|
||||||
GPIO_Speed_100MHz,
|
|
||||||
GPIO_OType_PP,
|
|
||||||
GPIO_PuPd_NOPULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct stm32f4_gpio stm32_f4_discovery_led_5 = {
|
|
||||||
GPIOD,
|
|
||||||
&stm32_f4_discovery_led_5_gpio,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct gpio __led_5 = {
|
|
||||||
(void*)&stm32_f4_discovery_led_5,
|
|
||||||
&gpio_fp
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct driver led_5 = {
|
|
||||||
DRIVER_TYPE_GPIO,
|
|
||||||
&__led_5,
|
|
||||||
};
|
|
||||||
|
|
||||||
// LED 6
|
|
||||||
static const GPIO_InitTypeDef stm32_f4_discovery_led_6_gpio = {
|
|
||||||
GPIO_Pin_15,
|
|
||||||
GPIO_Mode_OUT,
|
|
||||||
GPIO_Speed_100MHz,
|
|
||||||
GPIO_OType_PP,
|
|
||||||
GPIO_PuPd_NOPULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct stm32f4_gpio stm32_f4_discovery_led_6 = {
|
|
||||||
GPIOD,
|
|
||||||
&stm32_f4_discovery_led_6_gpio,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct gpio __led_6 = {
|
|
||||||
(void*)&stm32_f4_discovery_led_6,
|
|
||||||
&gpio_fp
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct driver led_6 = {
|
|
||||||
DRIVER_TYPE_GPIO,
|
|
||||||
&__led_6,
|
|
||||||
};
|
|
||||||
|
|
||||||
// BUTTON
|
|
||||||
static const GPIO_InitTypeDef stm32_f4_discovery_user_button_gpio = {
|
|
||||||
GPIO_Pin_0,
|
|
||||||
GPIO_Mode_IN,
|
|
||||||
GPIO_Speed_100MHz,
|
|
||||||
GPIO_OType_PP,
|
|
||||||
GPIO_PuPd_NOPULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const EXTI_InitTypeDef stm32_f4_discovery_user_button_exti = {
|
|
||||||
EXTI_Line0,
|
|
||||||
EXTI_Mode_Interrupt,
|
|
||||||
EXTI_Trigger_Rising_Falling,
|
|
||||||
ENABLE
|
|
||||||
};
|
|
||||||
|
|
||||||
static const NVIC_InitTypeDef stm32_f4_discovery_user_button_nvic = {
|
|
||||||
EXTI0_IRQn,
|
|
||||||
0x0F,
|
|
||||||
0x0F,
|
|
||||||
ENABLE
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct stm32f4_gpio stm32_f4_discovery_user_button = {
|
|
||||||
GPIOA,
|
|
||||||
&stm32_f4_discovery_user_button_gpio,
|
|
||||||
&stm32_f4_discovery_user_button_exti,
|
|
||||||
&stm32_f4_discovery_user_button_nvic,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct gpio user_button = {
|
|
||||||
(void*)&stm32_f4_discovery_user_button,
|
|
||||||
&gpio_fp
|
|
||||||
};
|
|
||||||
|
|
||||||
//! \brief Setup the hardware of the stm32f4-discovery board.
|
|
||||||
void board_init(void);
|
|
||||||
|
|
||||||
#endif /* BSP_STM32F4_DISCOVERY_H_ */
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/board/stm32f4-discovery/include
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
* cpu.h
|
|
||||||
*
|
|
||||||
* Created on: Oct 1, 2015
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CPU_H_
|
|
||||||
#define CPU_H_
|
|
||||||
|
|
||||||
#endif /* CPU_H_ */
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
INCLUDES += firmware/arch/stm32f4xx/cpu
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/cpu
|
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
CHECK_FOLDER += firmware/arch/stm32f4xx/driver
|
|
||||||
SUB_FOLDER += firmware/arch/stm32f4xx/driver
|
|
||||||
INCLUDES += firmware/arch/stm32f4xx/driver/include
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/driver
|
|
||||||
DOC_SRC += firmware/arch/stm32f4xx/driver/include
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
//! \file stm32_sys_tick.h
|
|
||||||
//! \author tkl
|
|
||||||
//! \date Feb 15, 2012
|
|
||||||
//! \brief Header file of the stm32f10x architecture dependent sys tick timer implementation.
|
|
||||||
#ifndef STM32_SYS_TICK_H_
|
|
||||||
#define STM32_SYS_TICK_H_
|
|
||||||
|
|
||||||
#include "timer.h"
|
|
||||||
|
|
||||||
typedef void* (*stm32_sys_tick_cb_t)(void*); //!< callback for the external interrupt
|
|
||||||
|
|
||||||
//! \brief Type of sys tick base time.
|
|
||||||
enum stm32_sys_tick_time_base {
|
|
||||||
STM32_SYS_TICK_TIME_BASE_NONE = 0, //!< Not init
|
|
||||||
STM32_SYS_TICK_TIME_BASE_US, //!< Tick time = 1 us.
|
|
||||||
STM32_SYS_TICK_TIME_BASE_MS //!< Tick time = 1 ms.
|
|
||||||
};
|
|
||||||
|
|
||||||
//! \brief The sys tick device.
|
|
||||||
struct stm32_sys_tick {
|
|
||||||
const enum stm32_sys_tick_time_base *tick_time_base; //!< time base for the system tick
|
|
||||||
stm32_sys_tick_cb_t sys_tick_cb; //!< callback for the sys tick interrupt
|
|
||||||
void *sys_tick_cb_param; //!< parameter for the callback
|
|
||||||
};
|
|
||||||
|
|
||||||
//! \brief Open a sys tick timer.
|
|
||||||
//! \param sys_tick The sys tick to open. Must be of type const stm32_sys_tick_t*.
|
|
||||||
//! \return -1 in error case.
|
|
||||||
int stm32_sys_tick_open(const void *sys_tick);
|
|
||||||
|
|
||||||
//! \brief Close a sys tick timer.
|
|
||||||
//! \param sys_tick The sys tick to close. Must be of type const stm32_sys_tick_t*.
|
|
||||||
//! \return -1 in error case.
|
|
||||||
int stm32_sys_tick_close(const void *sys_tick);
|
|
||||||
|
|
||||||
//! \brief Set the call back for a sys tick timer.
|
|
||||||
//! \param sys_tick The sys tick to open. Mus be of type const stm32_sys_tick_t*.
|
|
||||||
//! \param callback The function pointer of the call back function.
|
|
||||||
//! \param param The parameter for the call back function.
|
|
||||||
//! \return -1 in error case.
|
|
||||||
int stm32_sys_tick_set_cb(const void *sys_tick, const void *callback, const void *param);
|
|
||||||
|
|
||||||
static const struct timer_fp timer_fp = {
|
|
||||||
stm32_sys_tick_open,
|
|
||||||
stm32_sys_tick_close,
|
|
||||||
stm32_sys_tick_set_cb
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* STM32_SYS_TICK_H_ */
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
//! \file stm32f4_gpio.h
|
|
||||||
//! \author tkl
|
|
||||||
//! \date Mai 8, 2012
|
|
||||||
//! \brief Header file of the stm32f4xx architecture dependent gpio driver.
|
|
||||||
#ifndef STM32F4_GPIO_H_
|
|
||||||
#define STM32F4_GPIO_H_
|
|
||||||
|
|
||||||
//! callback for the external interrupt
|
|
||||||
typedef void* (*gpio_ext_it_cb_t)(void*);
|
|
||||||
|
|
||||||
//! \brief stm32f4 gpio device
|
|
||||||
struct stm32f4_gpio {
|
|
||||||
GPIO_TypeDef *port; //!< Gpio port
|
|
||||||
const GPIO_InitTypeDef *pin; //!< Gpio pin
|
|
||||||
const EXTI_InitTypeDef *exti; //!< Gpio exit it (could be NULL)
|
|
||||||
const NVIC_InitTypeDef *nvic; //!< Gpio nvic (could be NULL)
|
|
||||||
gpio_ext_it_cb_t ext_it_cb; //!< Gpio ext it callback (could be NULL)
|
|
||||||
void *param; //!< Parameter for the callback
|
|
||||||
};
|
|
||||||
|
|
||||||
//! \brief Open a gpio.
|
|
||||||
//! \param gpio The gpio to open. Must be of type stm32f4_gpio_t.
|
|
||||||
//! \retval -1 in error case.
|
|
||||||
int stm32f4_gpio_open(const void *gpio);
|
|
||||||
|
|
||||||
//! \brief Close a gpio.
|
|
||||||
//! \param gpio The gpio to close. Must be of type stm32f4_gpio_t.
|
|
||||||
//! \retval -1 in error case.
|
|
||||||
int stm32f4_gpio_close(const void *gpio);
|
|
||||||
|
|
||||||
//! \brief Read a gpio.
|
|
||||||
//! \param gpio The gpio to read. Must be of type stm32f4_gpio_t.
|
|
||||||
//! \return read out value.
|
|
||||||
char stm32f4_gpio_read(const void *gpio);
|
|
||||||
|
|
||||||
//! \brief Write to a gpio.
|
|
||||||
//! \param gpio The gpio to write. Must be of type stm32f4_gpio_t.
|
|
||||||
//! \param byte The data to write.
|
|
||||||
void stm32f4_gpio_write(const void *gpio, char byte);
|
|
||||||
|
|
||||||
//! \brief Toggle a gpio.
|
|
||||||
//! \param gpio The gpio to read. Must be of type stm32f4_gpio_t.
|
|
||||||
void stm32f4_gpio_toggle(const void *gpio);
|
|
||||||
|
|
||||||
//! \brief Set the callback for a gpio pin external interrupt.
|
|
||||||
//! \param gpio The gpio to set call back for. Must be of type stm32f4_gpio_t.
|
|
||||||
//! \param callback The function pointer to call back.
|
|
||||||
//! \param param The parameter for the call back.
|
|
||||||
//! \retval -1 in error case.
|
|
||||||
int stm32f4_gpio_set_exti_callback(const void *gpio, const void *callback,
|
|
||||||
const void *param);
|
|
||||||
|
|
||||||
static const struct gpio_fp gpio_fp = {
|
|
||||||
stm32f4_gpio_open,
|
|
||||||
stm32f4_gpio_close,
|
|
||||||
stm32f4_gpio_read,
|
|
||||||
stm32f4_gpio_write,
|
|
||||||
stm32f4_gpio_toggle,
|
|
||||||
stm32f4_gpio_set_exti_callback
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* STM32F4_GPIO_H_ */
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* stm32_uart.h
|
|
||||||
*
|
|
||||||
* Created on: Jul 24, 2016
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_UART_STM32_UART_H_
|
|
||||||
#define SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_UART_STM32_UART_H_
|
|
||||||
|
|
||||||
#include "driver.h"
|
|
||||||
#include "uart.h"
|
|
||||||
|
|
||||||
//! \brief Stm32f4 uart device.
|
|
||||||
struct stm32f4_uart {
|
|
||||||
const GPIO_InitTypeDef *gpio_init;
|
|
||||||
GPIO_TypeDef *gpio_port;
|
|
||||||
uint8_t pin_src_rx;
|
|
||||||
uint8_t pin_src_tx;
|
|
||||||
const USART_InitTypeDef *usart_init;
|
|
||||||
USART_TypeDef *usart_port;
|
|
||||||
uint16_t usart_it_select;
|
|
||||||
const NVIC_InitTypeDef *nvic_init;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! \brief Open an uart device.
|
|
||||||
//! \param this The uart to open.
|
|
||||||
//! \retval -1 in error case.
|
|
||||||
int stm32f4_uart_open(const void *this);
|
|
||||||
|
|
||||||
//! \brief Close an uart device.
|
|
||||||
//! \param this The uart to close.
|
|
||||||
//! \retval -1 in error case.
|
|
||||||
int stm32f4_uart_close(const void *this);
|
|
||||||
|
|
||||||
//! \brief Read from an uart device.
|
|
||||||
//! \param this The uart to read from.
|
|
||||||
//! \param buffer The buffer to read to.
|
|
||||||
//! \param len The length of the buffer.
|
|
||||||
//! \retval -1 in error case, otherwise number of read characters.
|
|
||||||
int stm32f4_uart_read(const void *this, char *buffer, int len);
|
|
||||||
|
|
||||||
//! \brief Write to an uart device.
|
|
||||||
//! \param this The uart to write to.
|
|
||||||
//! \param buffer The buffer to write.
|
|
||||||
//! \param len The number of characters to write.
|
|
||||||
//! \retval -1 in error case, otherwise number of written characters.
|
|
||||||
int stm32f4_uart_write(const void *this, const char *buffer, int len);
|
|
||||||
|
|
||||||
//! \brief Set a callback for interrupt handling of the uart.
|
|
||||||
//! \param this The uart.
|
|
||||||
//! \param callback The callback to execute in interrupt case.
|
|
||||||
//! \param param The argument for the callback.
|
|
||||||
//! \retval -1 in error case.
|
|
||||||
int stm32f4_uart_set_cb(const void *this, const void *callback, const void *param);
|
|
||||||
|
|
||||||
static const struct uart_fp stm32f4_uart_fp = {
|
|
||||||
stm32f4_uart_open,
|
|
||||||
stm32f4_uart_close,
|
|
||||||
stm32f4_uart_read,
|
|
||||||
stm32f4_uart_write,
|
|
||||||
stm32f4_uart_set_cb
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_UART_STM32_UART_H_ */
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
//! \file stm32_sys_tick.c
|
|
||||||
//! \author tkl
|
|
||||||
//! \date Feb 15, 2012
|
|
||||||
//! \brief Source file of the stm32f10x architecture dependent sys tick timer implementation.
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "stm32f4xx.h"
|
|
||||||
|
|
||||||
#include "stm32_sys_tick.h"
|
|
||||||
#include "stm32f4xx_isr.h"
|
|
||||||
|
|
||||||
struct stm32_sys_tick_obj {
|
|
||||||
stm32_sys_tick_cb_t sys_tick_cb;
|
|
||||||
void *sys_tick_cb_param;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct stm32_sys_tick_obj stm32_sys_tick_obj;
|
|
||||||
|
|
||||||
int stm32_sys_tick_open(const void *sys_tick) {
|
|
||||||
if(sys_tick == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
struct stm32_sys_tick *this = (struct stm32_sys_tick *)sys_tick;
|
|
||||||
uint32_t div = 1000;
|
|
||||||
switch(*this->tick_time_base) {
|
|
||||||
case STM32_SYS_TICK_TIME_BASE_US:
|
|
||||||
div = 1000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_SYS_TICK_TIME_BASE_MS:
|
|
||||||
div = 1000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if(SysTick_Config(SystemCoreClock / div))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32_sys_tick_close(const void *sys_tick)
|
|
||||||
{
|
|
||||||
if(sys_tick == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
SysTick->CTRL = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32_sys_tick_set_cb(const void *sys_tick, const void *callback, const void *param)
|
|
||||||
{
|
|
||||||
if((sys_tick == NULL) || (callback == NULL))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
stm32_sys_tick_obj.sys_tick_cb = (stm32_sys_tick_cb_t)callback;
|
|
||||||
stm32_sys_tick_obj.sys_tick_cb_param = (void*)param;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SysTick_Handler(void)
|
|
||||||
{
|
|
||||||
enter_isr();
|
|
||||||
|
|
||||||
if(stm32_sys_tick_obj.sys_tick_cb != NULL) {
|
|
||||||
stm32_sys_tick_cb_t cb = stm32_sys_tick_obj.sys_tick_cb;
|
|
||||||
void *param = stm32_sys_tick_obj.sys_tick_cb_param;
|
|
||||||
cb(param);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit_isr();
|
|
||||||
}
|
|
||||||
@@ -1,260 +0,0 @@
|
|||||||
//! \file stm32f4_gpio.c
|
|
||||||
//! \author tkl
|
|
||||||
//! \date Mai 8, 2012
|
|
||||||
//! \brief Source file of the stm32f4 architecture dependent gpio driver.
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "stm32f4xx.h"
|
|
||||||
|
|
||||||
#include "gpio.h"
|
|
||||||
#include "stm32f4_gpio.h"
|
|
||||||
|
|
||||||
//! \brief Contains data for a callback for an external interrupt.
|
|
||||||
typedef struct {
|
|
||||||
gpio_ext_it_cb_t callback; //!< The call back to be executed.
|
|
||||||
void *param; //!< Parameter for the callback
|
|
||||||
}exti_cb_list_t;
|
|
||||||
|
|
||||||
//! \brief Contains call back data for all 16 exti lines.
|
|
||||||
static struct {
|
|
||||||
exti_cb_list_t callback_list[16]; //!< Call back data list for the exti lines.
|
|
||||||
}gpio_obj;
|
|
||||||
|
|
||||||
static uint8_t gpio_bin2dec(uint16_t bin)
|
|
||||||
{
|
|
||||||
uint8_t ret = 0;
|
|
||||||
switch(bin) {
|
|
||||||
case 0x0001: ret = 0; break;
|
|
||||||
case 0x0002: ret = 1; break;
|
|
||||||
case 0x0004: ret = 2; break;
|
|
||||||
case 0x0008: ret = 3; break;
|
|
||||||
case 0x0010: ret = 4; break;
|
|
||||||
case 0x0020: ret = 5; break;
|
|
||||||
case 0x0040: ret = 6; break;
|
|
||||||
case 0x0080: ret = 7; break;
|
|
||||||
case 0x0100: ret = 8; break;
|
|
||||||
case 0x0200: ret = 9; break;
|
|
||||||
case 0x0400: ret = 10; break;
|
|
||||||
case 0x0800: ret = 11; break;
|
|
||||||
case 0x1000: ret = 12; break;
|
|
||||||
case 0x2000: ret = 13; break;
|
|
||||||
case 0x4000: ret = 14; break;
|
|
||||||
case 0x8000: ret = 15; break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gpio_init(const struct stm32f4_gpio *gpio)
|
|
||||||
{
|
|
||||||
uint8_t m_port = 0;
|
|
||||||
uint8_t m_pin = 0;
|
|
||||||
uint32_t clock = 0;
|
|
||||||
if(gpio == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(gpio->port == GPIOA) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOA;
|
|
||||||
m_port = EXTI_PortSourceGPIOA;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOB) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOB;
|
|
||||||
m_port = EXTI_PortSourceGPIOB;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOC) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOC;
|
|
||||||
m_port = EXTI_PortSourceGPIOC;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOD) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOD;
|
|
||||||
m_port = EXTI_PortSourceGPIOD;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOE) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOE;
|
|
||||||
m_port = EXTI_PortSourceGPIOE;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOF) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOF;
|
|
||||||
m_port = EXTI_PortSourceGPIOF;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOG) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOG;
|
|
||||||
m_port = EXTI_PortSourceGPIOG;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOH) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOH;
|
|
||||||
m_port = EXTI_PortSourceGPIOH;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOI) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOI;
|
|
||||||
m_port = EXTI_PortSourceGPIOI;
|
|
||||||
}
|
|
||||||
|
|
||||||
RCC_AHB1PeriphClockCmd(clock, ENABLE);
|
|
||||||
m_pin = gpio_bin2dec(gpio->pin->GPIO_Pin);
|
|
||||||
|
|
||||||
SYSCFG_EXTILineConfig(m_port, m_pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_gpio_open(const void *gpio)
|
|
||||||
{
|
|
||||||
struct stm32f4_gpio *this;
|
|
||||||
uint8_t m_pin = 0;
|
|
||||||
|
|
||||||
if(gpio == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
|
||||||
gpio_init(this);
|
|
||||||
m_pin = gpio_bin2dec(this->pin->GPIO_Pin);
|
|
||||||
|
|
||||||
GPIO_Init(this->port, (GPIO_InitTypeDef*)this->pin);
|
|
||||||
|
|
||||||
if(this->ext_it_cb != NULL) {
|
|
||||||
gpio_obj.callback_list[m_pin].callback = this->ext_it_cb;
|
|
||||||
gpio_obj.callback_list[m_pin].param = this->param;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((this->exti != NULL) && (this->nvic != NULL)) {
|
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
|
||||||
EXTI_Init((EXTI_InitTypeDef*)this->exti);
|
|
||||||
NVIC_Init((NVIC_InitTypeDef*)this->nvic);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_gpio_close(const void *gpio)
|
|
||||||
{
|
|
||||||
if(gpio == NULL)
|
|
||||||
return -1;
|
|
||||||
// TODO: deinit exti, nvic & gpio
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char stm32f4_gpio_read(const void *gpio)
|
|
||||||
{
|
|
||||||
struct stm32f4_gpio *this;
|
|
||||||
if(gpio == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
|
||||||
return GPIO_ReadOutputDataBit(this->port, this->pin->GPIO_Pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void stm32f4_gpio_write(const void *gpio, char byte) {
|
|
||||||
struct stm32f4_gpio *this;
|
|
||||||
if(gpio == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
|
||||||
GPIO_WriteBit(this->port, this->pin->GPIO_Pin, (BitAction)byte);
|
|
||||||
}
|
|
||||||
|
|
||||||
void stm32f4_gpio_toggle(const void *gpio)
|
|
||||||
{
|
|
||||||
struct stm32f4_gpio *this;
|
|
||||||
if(gpio == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
|
||||||
BitAction act = Bit_SET;
|
|
||||||
if(GPIO_ReadOutputDataBit(this->port, this->pin->GPIO_Pin))
|
|
||||||
act = Bit_RESET;
|
|
||||||
|
|
||||||
GPIO_WriteBit(this->port, this->pin->GPIO_Pin, act);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_gpio_set_exti_callback(const void *gpio,
|
|
||||||
const void *callback, const void *param)
|
|
||||||
{
|
|
||||||
struct stm32f4_gpio *this;
|
|
||||||
uint8_t pin;
|
|
||||||
if((gpio == NULL) || (callback == NULL))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
|
||||||
pin = gpio_bin2dec(this->exti->EXTI_Line);
|
|
||||||
|
|
||||||
gpio_obj.callback_list[pin].callback = (gpio_ext_it_cb_t)callback;
|
|
||||||
gpio_obj.callback_list[pin].param = (void*)param;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief The ISR for the EXTI0_IRQn interrupt.
|
|
||||||
void EXTI0_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if(gpio_obj.callback_list[0].callback != NULL) {
|
|
||||||
gpio_ext_it_cb_t cb = gpio_obj.callback_list[0].callback;
|
|
||||||
void *param = gpio_obj.callback_list[0].param;
|
|
||||||
cb(param);
|
|
||||||
}
|
|
||||||
EXTI_ClearITPendingBit(EXTI_Line0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief The ISR for the EXTI1_IRQn interrupt.
|
|
||||||
void EXTI1_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if(gpio_obj.callback_list[1].callback != NULL) {
|
|
||||||
gpio_ext_it_cb_t cb = gpio_obj.callback_list[1].callback;
|
|
||||||
void *param = gpio_obj.callback_list[1].param;
|
|
||||||
cb(param);
|
|
||||||
}
|
|
||||||
EXTI_ClearITPendingBit(EXTI_Line1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief The ISR for the EXTI2_IRQn interrupt.
|
|
||||||
void EXTI2_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if(gpio_obj.callback_list[2].callback != NULL) {
|
|
||||||
gpio_ext_it_cb_t cb = gpio_obj.callback_list[2].callback;
|
|
||||||
void *param = gpio_obj.callback_list[2].param;
|
|
||||||
cb(param);
|
|
||||||
}
|
|
||||||
EXTI_ClearITPendingBit(EXTI_Line2);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief The ISR for the EXTI3_IRQn interrupt.
|
|
||||||
void EXTI3_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if(gpio_obj.callback_list[3].callback != NULL) {
|
|
||||||
gpio_ext_it_cb_t cb = gpio_obj.callback_list[3].callback;
|
|
||||||
void *param = gpio_obj.callback_list[3].param;
|
|
||||||
cb(param);
|
|
||||||
}
|
|
||||||
EXTI_ClearITPendingBit(EXTI_Line3);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief The ISR for the EXTI4_IRQn interrupt.
|
|
||||||
void EXTI4_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if(gpio_obj.callback_list[4].callback != NULL) {
|
|
||||||
gpio_ext_it_cb_t cb = gpio_obj.callback_list[4].callback;
|
|
||||||
void *param = gpio_obj.callback_list[4].param;
|
|
||||||
cb(param);
|
|
||||||
}
|
|
||||||
EXTI_ClearITPendingBit(EXTI_Line4);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief The ISR for the EXTI9_5_IRQn interrupt.
|
|
||||||
void EXTI9_5_IRQHandler(void) {
|
|
||||||
uint32_t exti = 0;
|
|
||||||
uint8_t pin;
|
|
||||||
if(EXTI_GetITStatus(EXTI_Line6))
|
|
||||||
exti = EXTI_Line6;
|
|
||||||
|
|
||||||
pin = gpio_bin2dec(exti);
|
|
||||||
if(gpio_obj.callback_list[pin].callback != NULL) {
|
|
||||||
gpio_ext_it_cb_t cb = gpio_obj.callback_list[pin].callback;
|
|
||||||
void *param = gpio_obj.callback_list[pin].param;
|
|
||||||
cb(param);
|
|
||||||
}
|
|
||||||
EXTI_ClearITPendingBit(exti);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief The ISR for the EXTI15_10_IRQn interrupt.
|
|
||||||
void EXTI15_10_IRQHandler(void) {
|
|
||||||
// TODO: detect & clear pending bit
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
/*
|
|
||||||
* stm32f4_uart.c
|
|
||||||
*
|
|
||||||
* Created on: Jul 24, 2016
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "stm32f4xx.h"
|
|
||||||
#include "stm32f4xx_isr.h"
|
|
||||||
#include "stm32f4_uart.h"
|
|
||||||
|
|
||||||
struct stm32f4_uart_obj {
|
|
||||||
const void *callback; //!< Interrupt callback.
|
|
||||||
const void *parameter; //!< argument for the callback.
|
|
||||||
};
|
|
||||||
|
|
||||||
static volatile struct stm32f4_uart_obj uart1_obj;
|
|
||||||
|
|
||||||
int stm32f4_uart_open(const void *this)
|
|
||||||
{
|
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
|
||||||
uint8_t gpio_af = 0;
|
|
||||||
uint32_t rcc_apb_uart = 0, rcc_apb_gpio = 0;
|
|
||||||
|
|
||||||
if(uart->usart_port == USART1) {
|
|
||||||
gpio_af = GPIO_AF_USART1;
|
|
||||||
rcc_apb_uart = RCC_APB2Periph_USART1;
|
|
||||||
}
|
|
||||||
if(uart->gpio_port == GPIOA) {
|
|
||||||
rcc_apb_gpio = RCC_AHB1Periph_GPIOA;
|
|
||||||
}
|
|
||||||
else if(uart->gpio_port == GPIOB) {
|
|
||||||
rcc_apb_gpio = RCC_AHB1Periph_GPIOB;
|
|
||||||
}
|
|
||||||
|
|
||||||
RCC_APB2PeriphClockCmd(rcc_apb_uart, ENABLE);
|
|
||||||
RCC_AHB1PeriphClockCmd(rcc_apb_gpio, ENABLE);
|
|
||||||
|
|
||||||
GPIO_Init(uart->gpio_port, (GPIO_InitTypeDef *)uart->gpio_init);
|
|
||||||
|
|
||||||
GPIO_PinAFConfig(uart->gpio_port, uart->pin_src_rx, gpio_af);
|
|
||||||
GPIO_PinAFConfig(uart->gpio_port, uart->pin_src_tx, gpio_af);
|
|
||||||
|
|
||||||
USART_Init(uart->usart_port, (USART_InitTypeDef *)uart->usart_init);
|
|
||||||
USART_ITConfig(uart->usart_port, uart->usart_it_select, ENABLE);
|
|
||||||
NVIC_Init((NVIC_InitTypeDef *)uart->nvic_init);
|
|
||||||
USART_Cmd(uart->usart_port, ENABLE);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_uart_close(const void *this)
|
|
||||||
{
|
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
|
||||||
USART_Cmd(uart->usart_port, DISABLE);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_uart_read(const void *this, char *buffer, int len)
|
|
||||||
{
|
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
|
||||||
*buffer = uart->usart_port->DR;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_uart_write(const void *this, const char *buffer, int len)
|
|
||||||
{
|
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
|
||||||
int i;
|
|
||||||
for(i = 0; i < len; i++) {
|
|
||||||
// wait until data register is empty
|
|
||||||
while(!(uart->usart_port->SR & 0x00000040));
|
|
||||||
USART_SendData(uart->usart_port, buffer[i]);
|
|
||||||
}
|
|
||||||
return (i);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_uart_set_cb(const void *this, const void *callback, const void *param)
|
|
||||||
{
|
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
|
||||||
if(uart->usart_port == USART1) {
|
|
||||||
uart1_obj.callback = callback;
|
|
||||||
uart1_obj.parameter = param;
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is the interrupt request handler (IRQ) for ALL USART1 interrupts
|
|
||||||
void USART1_IRQHandler(void)
|
|
||||||
{
|
|
||||||
enter_isr();
|
|
||||||
// check if the USART1 receive interrupt flag was set
|
|
||||||
if(USART_GetITStatus(USART1, USART_IT_RXNE)) {
|
|
||||||
if(uart1_obj.callback) {
|
|
||||||
void (*cb)(const void *) = uart1_obj.callback;
|
|
||||||
cb(uart1_obj.parameter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit_isr();
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
* stm32f4xx_ctx.h
|
|
||||||
*
|
|
||||||
* Created on: Oct 1, 2015
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef STM32F4XX_CTX_H_
|
|
||||||
#define STM32F4XX_CTX_H_
|
|
||||||
|
|
||||||
void start_first_task(void);
|
|
||||||
void arch_schedule(void);
|
|
||||||
|
|
||||||
#define restore_context() { enable_irq(); start_first_task(); }
|
|
||||||
|
|
||||||
#endif /* STM32F4XX_CTX_H_ */
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
/*
|
|
||||||
* stm32f4xx_irq.h
|
|
||||||
*
|
|
||||||
* Created on: Oct 1, 2015
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef STM32F4XX_IRQ_H_
|
|
||||||
#define STM32F4XX_IRQ_H_
|
|
||||||
|
|
||||||
unsigned int disable_irq(void);
|
|
||||||
unsigned int enable_irq(void);
|
|
||||||
void restore_irq(unsigned int state);
|
|
||||||
|
|
||||||
#endif /* STM32F4XX_IRQ_H_ */
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
/*
|
|
||||||
* stm32f4xx_isr.h
|
|
||||||
*
|
|
||||||
* Created on: Sep 25, 2015
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef STM32F4XX_ISR_H_
|
|
||||||
#define STM32F4XX_ISR_H_
|
|
||||||
|
|
||||||
void enter_isr(void);
|
|
||||||
void exit_isr(void);
|
|
||||||
|
|
||||||
#endif /* STM32F4XX_ISR_H_ */
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
/*
|
|
||||||
* stm32f4xx_low_power.h
|
|
||||||
*
|
|
||||||
* Created on: Oct 1, 2015
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef STM32F4XX_LOW_POWER_H_
|
|
||||||
#define STM32F4XX_LOW_POWER_H_
|
|
||||||
|
|
||||||
/* TODO: real implement!!! */
|
|
||||||
#define enter_low_power()
|
|
||||||
#define exit_low_power()
|
|
||||||
|
|
||||||
#endif /* STM32F4XX_LOW_POWER_H_ */
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* stm32f4xx_stack.h
|
|
||||||
*
|
|
||||||
* Created on: Oct 1, 2015
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef STM32F4XX_STACK_H_
|
|
||||||
#define STM32F4XX_STACK_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
typedef uint32_t stack_t;
|
|
||||||
|
|
||||||
stack_t *stack_init(
|
|
||||||
void (*task_func)(void *),
|
|
||||||
void *arg,
|
|
||||||
stack_t *stack_start,
|
|
||||||
unsigned int stack_size);
|
|
||||||
|
|
||||||
#endif /* STM32F4XX_STACK_H_ */
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
include firmware/arch/stm32f4xx/lib/stdperiph/stdperiph.mk
|
|
||||||
-3711
File diff suppressed because it is too large
Load Diff
-3269
File diff suppressed because it is too large
Load Diff
-3711
File diff suppressed because it is too large
Load Diff
-3269
File diff suppressed because it is too large
Load Diff
-3969
File diff suppressed because it is too large
Load Diff
-6527
File diff suppressed because it is too large
Load Diff
-14
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
SET TMP=C:\Temp
|
|
||||||
SET TEMP=C:\Temp
|
|
||||||
|
|
||||||
SET UVEXE=C:\Keil\UV4\UV4.EXE
|
|
||||||
|
|
||||||
%UVEXE% -rb arm_cortexM0x_math.uvproj -t"DSP_Lib CM0 LE" -o"DSP_Lib CM0 LE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM0x_math.uvproj -t"DSP_Lib CM0 BE" -o"DSP_Lib CM0 BE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM3x_math.uvproj -t"DSP_Lib CM3 LE" -o"DSP_Lib CM3 LE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM3x_math.uvproj -t"DSP_Lib CM3 BE" -o"DSP_Lib CM3 BE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 LE" -o"DSP_Lib CM4 LE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 BE" -o"DSP_Lib CM4 BE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 LE FPU" -o"DSP_Lib CM4 LE FPU.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 BE FPU" -o"DSP_Lib CM4 BE FPU.txt"
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_f32.c
|
|
||||||
*
|
|
||||||
* Description: Vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicAbs Vector Absolute Value
|
|
||||||
*
|
|
||||||
* Computes the absolute value of a vector on an element-by-element basis.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = abs(pSrcA[n]), 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* The operation can be done in-place by setting the input and output pointers to the same buffer.
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-170
@@ -1,170 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1; /* Input value1 */
|
|
||||||
q15_t in2; /* Input value2 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read two inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer by packing the two values, in a single cycle */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in1 > 0) ? in1 : __SSAT(-in1, 16)),
|
|
||||||
((in2 > 0) ? in2 : __SSAT(-in2, 16)), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in2 > 0) ? in2 : __SSAT(-in2, 16)),
|
|
||||||
((in1 > 0) ? in1 : __SSAT(-in1, 16)), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in1 > 0) ? in1 : __SSAT(-in1, 16)),
|
|
||||||
((in2 > 0) ? in2 : __SSAT(-in2, 16)), 16);
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in2 > 0) ? in2 : __SSAT(-in2, 16)),
|
|
||||||
((in1 > 0) ? in1 : __SSAT(-in1, 16)), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
|
|
||||||
/* Calculate absolute value of input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (in1 > 0) ? in1 : __SSAT(-in1, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q15_t in; /* Temporary input variable */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in = *pSrc++;
|
|
||||||
|
|
||||||
/* Calculate absolute value of input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (in > 0) ? in : __SSAT(-in, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-120
@@ -1,120 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
q31_t in; /* Input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and then store the results in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute value of the input (if -1 then saturated to 0x7fffffff) and then store the results in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-143
@@ -1,143 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1; /* Input value1 */
|
|
||||||
q7_t in2; /* Input value2 */
|
|
||||||
q7_t in3; /* Input value3 */
|
|
||||||
q7_t in4; /* Input value4 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read 4 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer by packing the 4 values in single cycle */
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PACKq7(((in1 > 0) ? in1 : __SSAT(-in1, 8)),
|
|
||||||
((in2 > 0) ? in2 : __SSAT(-in2, 8)),
|
|
||||||
((in3 > 0) ? in3 : __SSAT(-in3, 8)),
|
|
||||||
((in4 > 0) ? in4 : __SSAT(-in4, 8)));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer */
|
|
||||||
*pDst++ = (in1 > 0) ? in1 : __SSAT(-in1, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q7_t in; /* Temporary input varible */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer */
|
|
||||||
*pDst++ = (in > 0) ? in : __SSAT(-in, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-121
@@ -1,121 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector addition.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicAdd Vector Addition
|
|
||||||
*
|
|
||||||
* Element-by-element addition of two vectors.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrcA[n] + pSrcB[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-127
@@ -1,127 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector addition
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __QADD16(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) * pSrcA++ + *pSrcB++), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-129
@@ -1,129 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector addition.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrcA++ + *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector addition.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD8(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrcA++ + *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) * pSrcA++ + *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup dot_prod Vector Dot Product
|
|
||||||
*
|
|
||||||
* Computes the dot product of two vectors.
|
|
||||||
* The vectors are multiplied element-by-element and then summed.
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of floating-point vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_dot_prod_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
float32_t * result)
|
|
||||||
{
|
|
||||||
float32_t sum = 0.0f; /* Temporary result storage */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer */
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
/* Store the result back in the destination buffer */
|
|
||||||
*result = sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-132
@@ -1,132 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of Q15 vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The intermediate multiplications are in 1.15 x 1.15 = 2.30 format and these
|
|
||||||
* results are added to a 64-bit accumulator in 34.30 format.
|
|
||||||
* Nonsaturating additions are used and given that there are 33 guard bits in the accumulator
|
|
||||||
* there is no risk of overflow.
|
|
||||||
* The return result is in 34.30 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_dot_prod_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q63_t * result)
|
|
||||||
{
|
|
||||||
q63_t sum = 0; /* Temporary result storage */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum = __SMLALD(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++, sum);
|
|
||||||
sum = __SMLALD(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++, sum);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the results in a temporary buffer. */
|
|
||||||
sum = __SMLALD(*pSrcA++, *pSrcB++, sum);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the results in a temporary buffer. */
|
|
||||||
sum += (q63_t) ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the result in the destination buffer in 34.30 format */
|
|
||||||
*result = sum;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-124
@@ -1,124 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of Q31 vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The intermediate multiplications are in 1.31 x 1.31 = 2.62 format and these
|
|
||||||
* are truncated to 2.48 format by discarding the lower 14 bits.
|
|
||||||
* The 2.48 result is then added without saturation to a 64-bit accumulator in 16.48 format.
|
|
||||||
* There are 15 guard bits in the accumulator and there is no risk of overflow as long as
|
|
||||||
* the length of the vectors is less than 2^16 elements.
|
|
||||||
* The return result is in 16.48 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_dot_prod_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q63_t * result)
|
|
||||||
{
|
|
||||||
q63_t sum = 0; /* Temporary result storage */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store the result in the destination buffer in 16.48 format */
|
|
||||||
*result = sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-163
@@ -1,163 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of Q7 vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The intermediate multiplications are in 1.7 x 1.7 = 2.14 format and these
|
|
||||||
* results are added to an accumulator in 18.14 format.
|
|
||||||
* Nonsaturating additions are used and there is no danger of wrap around as long as
|
|
||||||
* the vectors are less than 2^18 elements long.
|
|
||||||
* The return result is in 18.14 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_dot_prod_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q31_t * result)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
q31_t sum = 0; /* Temporary variables to store output */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q31_t input1, input2; /* Temporary variables to store input */
|
|
||||||
q15_t in1, in2; /* Temporary variables to store input */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Reading two inputs of SrcA buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcA++;
|
|
||||||
in2 = (q15_t) * pSrcA++;
|
|
||||||
input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* Reading two inputs of SrcB buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcB++;
|
|
||||||
in2 = (q15_t) * pSrcB++;
|
|
||||||
input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Perform Dot product of 2 packed inputs using SMLALD and store the result in a temporary variable. */
|
|
||||||
sum = __SMLAD(input1, input2, sum);
|
|
||||||
|
|
||||||
/* Reading two inputs of SrcA buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcA++;
|
|
||||||
in2 = (q15_t) * pSrcA++;
|
|
||||||
input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* Reading two inputs of SrcB buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcB++;
|
|
||||||
in2 = (q15_t) * pSrcB++;
|
|
||||||
input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Perform Dot product of 2 packed inputs using SMLALD and store the result in a temporary variable. */
|
|
||||||
sum = __SMLAD(input1, input2, sum);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Dot product and then store the results in a temporary buffer. */
|
|
||||||
sum = __SMLAD(*pSrcA++, *pSrcB++, sum);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Dot product and then store the results in a temporary buffer. */
|
|
||||||
sum += (q31_t) ((q15_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
/* Store the result in the destination buffer in 18.14 format */
|
|
||||||
*result = sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicMult Vector Multiplication
|
|
||||||
*
|
|
||||||
* Element-by-element multiplication of two vectors.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrcA[n] * pSrcB[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector multiplication.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the results in output buffer */
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the results in output buffer */
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-119
@@ -1,119 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the result in the destination buffer */
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the result in the destination buffer */
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-121
@@ -1,121 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector multiplication.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-125
@@ -1,125 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10 DP
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t out1, out2, out3, out4; /* Temporary variables to store the product */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the results in temporary variables */
|
|
||||||
out1 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
out2 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
out3 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
out4 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
|
|
||||||
/* Store the results of 4 inputs in the destination buffer in single cycle by packing */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the result in the destination buffer */
|
|
||||||
*pDst++ = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-117
@@ -1,117 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_f32.c
|
|
||||||
*
|
|
||||||
* Description: Negates floating-point vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup negate Vector Negate
|
|
||||||
*
|
|
||||||
* Negates the elements of a vector.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = -pSrc[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a floating-point vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-140
@@ -1,140 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_q15.c
|
|
||||||
*
|
|
||||||
* Description: Negates Q15 vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a Q15 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1, in2; /* Temporary variables */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Read two inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* Negate and then store the results in the destination buffer by packing. */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in1, 16), __SSAT(-in2, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in2, 16), __SSAT(-in1, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in1, 16), __SSAT(-in2, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in2, 16), __SSAT(-in1, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-119
@@ -1,119 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_q31.c
|
|
||||||
*
|
|
||||||
* Description: Negates Q31 vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a Q31 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
q31_t in; /* Temporary variable */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the result in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_q7.c
|
|
||||||
*
|
|
||||||
* Description: Negates Q7 vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a Q7 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1; /* Input value1 */
|
|
||||||
q7_t in2; /* Input value2 */
|
|
||||||
q7_t in3; /* Input value3 */
|
|
||||||
q7_t in4; /* Input value4 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Read four inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Negated results in the destination buffer in a single cycle by packing the results */
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PACKq7(__SSAT(-in1, 8), __SSAT(-in2, 8), __SSAT(-in3, 8),
|
|
||||||
__SSAT(-in4, 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup offset Vector Offset
|
|
||||||
*
|
|
||||||
* Adds a constant offset to each element of a vector.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrc[n] + offset, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a floating-point vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_offset_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t offset,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-128
@@ -1,128 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a Q15 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_offset_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t offset,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q31_t offset_packed; /* Offset packed to 32 bit */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
|
||||||
offset_packed = __PKHBT(offset, offset, 16);
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer, 2 samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrc)++, offset_packed);
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrc)++, offset_packed);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __QADD16(*pSrc++, offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) * pSrc++ + offset), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a Q31 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_offset_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t offset,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-127
@@ -1,127 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a Q7 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_offset_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t offset,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q31_t offset_packed; /* Offset packed to 32 bit */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
|
||||||
offset_packed = __PACKq7(offset, offset, offset, offset);
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination bufferfor 4 samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD8(*__SIMD32(pSrc)++, offset_packed);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) * pSrc++ + offset, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-133
@@ -1,133 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_f32.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a floating-point vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup scale Vector Scale
|
|
||||||
*
|
|
||||||
* Multiply a vector by a scalar value. For floating-point data, the algorithm used is:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrc[n] * scale, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* In the fixed-point Q7, Q15, and Q31 functions, <code>scale</code> is represented by
|
|
||||||
* a fractional multiplication <code>scaleFract</code> and an arithmetic shift <code>shift</code>.
|
|
||||||
* The shift allows the gain of the scaling operation to exceed 1.0.
|
|
||||||
* The algorithm used with fixed-point data is:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = (pSrc[n] * scaleFract) << shift, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* The overall scale factor applied to the fixed-point data is
|
|
||||||
* <pre>
|
|
||||||
* scale = scaleFract * 2^shift.
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a floating-point vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scale scale factor to be applied
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_scale_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t scale,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-162
@@ -1,162 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_q15.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a Q15 vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a Q15 vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scaleFract fractional portion of the scale value
|
|
||||||
* @param[in] shift number of bits to shift the result by
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The input data <code>*pSrc</code> and <code>scaleFract</code> are in 1.15 format.
|
|
||||||
* These are multiplied to yield a 2.30 intermediate result and this is shifted with saturation to 1.15 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_scale_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t scaleFract,
|
|
||||||
int8_t shift,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
int8_t kShift = 15 - shift; /* shift to apply after scaling */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1, in2; /* Temporary variables */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Reading 2 inputs from memory */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the inputs and then store the 2 results in the destination buffer
|
|
||||||
* in single cycle by packing the outputs */
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in1 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in2 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in2 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in1 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in1 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in2 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in2 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in1 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (__SSAT(((*pSrc++) * scaleFract) >> kShift, 16));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (__SSAT(((q31_t) * pSrc++ * scaleFract) >> kShift, 16));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-117
@@ -1,117 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_q31.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a Q31 vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a Q31 vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scaleFract fractional portion of the scale value
|
|
||||||
* @param[in] shift number of bits to shift the result by
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The input data <code>*pSrc</code> and <code>scaleFract</code> are in 1.31 format.
|
|
||||||
* These are multiplied to yield a 2.62 intermediate result and this is shifted with saturation to 1.31 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_scale_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t scaleFract,
|
|
||||||
int8_t shift,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
int8_t kShift = 31 - shift; /* Shift to apply after scaling */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_q7.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a Q7 vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a Q7 vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scaleFract fractional portion of the scale value
|
|
||||||
* @param[in] shift number of bits to shift the result by
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The input data <code>*pSrc</code> and <code>scaleFract</code> are in 1.7 format.
|
|
||||||
* These are multiplied to yield a 2.14 intermediate result and this is shifted with saturation to 1.7 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_scale_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t scaleFract,
|
|
||||||
int8_t shift,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
int8_t kShift = 7 - shift; /* shift to apply after scaling */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1, in2, in3, in4, out1, out2, out3, out4; /* Temporary variables to store input & output */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Reading 4 inputs from memory */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the inputs and then store the results in the temporary variables. */
|
|
||||||
out1 = (q7_t) (__SSAT(((in1) * scaleFract) >> kShift, 8));
|
|
||||||
out2 = (q7_t) (__SSAT(((in2) * scaleFract) >> kShift, 8));
|
|
||||||
out3 = (q7_t) (__SSAT(((in3) * scaleFract) >> kShift, 8));
|
|
||||||
out4 = (q7_t) (__SSAT(((in4) * scaleFract) >> kShift, 8));
|
|
||||||
|
|
||||||
/* Packing the individual outputs into 32bit and storing in
|
|
||||||
* destination buffer in single write */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) (__SSAT(((*pSrc++) * scaleFract) >> kShift, 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) (__SSAT((((q15_t) * pSrc++ * scaleFract) >> kShift), 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-239
@@ -1,239 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_shift_q15.c
|
|
||||||
*
|
|
||||||
* Description: Shifts the elements of a Q15 vector by a specified number of bits.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup shift
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Shifts the elements of a Q15 vector a specified number of bits.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_shift_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
int8_t shiftBits,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
uint8_t sign; /* Sign of shiftBits */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1, in2; /* Temporary variables */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Read 2 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16),
|
|
||||||
__SSAT((in2 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16),
|
|
||||||
__SSAT((in1 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16),
|
|
||||||
__SSAT((in2 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16),
|
|
||||||
__SSAT((in1 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT((*pSrc++ << shiftBits), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Read 2 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits),
|
|
||||||
(in2 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits),
|
|
||||||
(in1 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits),
|
|
||||||
(in2 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits),
|
|
||||||
(in1 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(((q31_t) * pSrc++ << shiftBits), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of shift group
|
|
||||||
*/
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_shift_q31.c
|
|
||||||
*
|
|
||||||
* Description: Shifts the elements of a Q31 vector by a specified number of bits.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @defgroup shift Vector Shift
|
|
||||||
*
|
|
||||||
* Shifts the elements of a fixed-point vector by a specified number of bits.
|
|
||||||
* There are separate functions for Q7, Q15, and Q31 data types.
|
|
||||||
* The underlying algorithm used is:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrc[n] << shift, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* If <code>shift</code> is positive then the elements of the vector are shifted to the left.
|
|
||||||
* If <code>shift</code> is negative then the elements of the vector are shifted to the right.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup shift
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Shifts the elements of a Q31 vector a specified number of bits.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_shift_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
int8_t shiftBits,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
uint8_t sign; /* Sign of shiftBits */
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A (>> or <<) shiftBits */
|
|
||||||
/* Shift the input and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A (>> or <<) shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of shift group
|
|
||||||
*/
|
|
||||||
-202
@@ -1,202 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_shift_q7.c
|
|
||||||
*
|
|
||||||
* Description: Processing function for the Q7 Shifting
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup shift
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Shifts the elements of a Q7 vector a specified number of bits.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x8 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_shift_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
int8_t shiftBits,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
uint8_t sign; /* Sign of shiftBits */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1; /* Input value1 */
|
|
||||||
q7_t in2; /* Input value2 */
|
|
||||||
q7_t in3; /* Input value3 */
|
|
||||||
q7_t in4; /* Input value4 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Read 4 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Shifted result in the destination buffer in single cycle by packing the outputs */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7(__SSAT((in1 << shiftBits), 8),
|
|
||||||
__SSAT((in2 << shiftBits), 8),
|
|
||||||
__SSAT((in3 << shiftBits), 8),
|
|
||||||
__SSAT((in4 << shiftBits), 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((*pSrc++ << shiftBits), 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Read 4 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Shifted result in the destination buffer in single cycle by packing the outputs */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7((in1 >> -shiftBits), (in2 >> -shiftBits),
|
|
||||||
(in3 >> -shiftBits), (in4 >> -shiftBits));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT(((q15_t) * pSrc++ << shiftBits), 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of shift group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicSub Vector Subtraction
|
|
||||||
*
|
|
||||||
* Element-by-element subtraction of two vectors.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrcA[n] - pSrcB[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-124
@@ -1,124 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer two samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QSUB16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
*__SIMD32(pDst)++ = __QSUB16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __QSUB16(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) * pSrcA++ - *pSrcB++), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-125
@@ -1,125 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrcA++ - *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-123
@@ -1,123 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer 4 samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QSUB8(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(*pSrcA++ - *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) * pSrcA++ - *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-144
@@ -1,144 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_common_tables.c
|
|
||||||
*
|
|
||||||
* Description: This file has common tables like Bitreverse, reciprocal etc which are used across different functions
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupTransforms
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CFFT_CIFFT
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \par
|
|
||||||
* Pseudo code for Generation of Bit reversal Table is
|
|
||||||
* \par
|
|
||||||
* <pre>for(l=1;l <= N/4;l++)
|
|
||||||
* {
|
|
||||||
* for(i=0;i<logN2;i++)
|
|
||||||
* {
|
|
||||||
* a[i]=l&(1<<i);
|
|
||||||
* }
|
|
||||||
* for(j=0; j<logN2; j++)
|
|
||||||
* {
|
|
||||||
* if (a[j]!=0)
|
|
||||||
* y[l]+=(1<<((logN2-1)-j));
|
|
||||||
* }
|
|
||||||
* y[l] = y[l] >> 1;
|
|
||||||
* } </pre>
|
|
||||||
* \par
|
|
||||||
* where N = 1024 logN2 = 10
|
|
||||||
* \par
|
|
||||||
* N is the maximum FFT Size supported
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Table for bit reversal process
|
|
||||||
*/
|
|
||||||
const uint16_t armBitRevTable[256] = {
|
|
||||||
0x100, 0x80, 0x180, 0x40, 0x140, 0xc0, 0x1c0,
|
|
||||||
0x20, 0x120, 0xa0, 0x1a0, 0x60, 0x160, 0xe0,
|
|
||||||
0x1e0, 0x10, 0x110, 0x90, 0x190, 0x50, 0x150,
|
|
||||||
0xd0, 0x1d0, 0x30, 0x130, 0xb0, 0x1b0, 0x70,
|
|
||||||
0x170, 0xf0, 0x1f0, 0x8, 0x108, 0x88, 0x188,
|
|
||||||
0x48, 0x148, 0xc8, 0x1c8, 0x28, 0x128, 0xa8,
|
|
||||||
0x1a8, 0x68, 0x168, 0xe8, 0x1e8, 0x18, 0x118,
|
|
||||||
0x98, 0x198, 0x58, 0x158, 0xd8, 0x1d8, 0x38,
|
|
||||||
0x138, 0xb8, 0x1b8, 0x78, 0x178, 0xf8, 0x1f8,
|
|
||||||
0x4, 0x104, 0x84, 0x184, 0x44, 0x144, 0xc4,
|
|
||||||
0x1c4, 0x24, 0x124, 0xa4, 0x1a4, 0x64, 0x164,
|
|
||||||
0xe4, 0x1e4, 0x14, 0x114, 0x94, 0x194, 0x54,
|
|
||||||
0x154, 0xd4, 0x1d4, 0x34, 0x134, 0xb4, 0x1b4,
|
|
||||||
0x74, 0x174, 0xf4, 0x1f4, 0xc, 0x10c, 0x8c,
|
|
||||||
0x18c, 0x4c, 0x14c, 0xcc, 0x1cc, 0x2c, 0x12c,
|
|
||||||
0xac, 0x1ac, 0x6c, 0x16c, 0xec, 0x1ec, 0x1c,
|
|
||||||
0x11c, 0x9c, 0x19c, 0x5c, 0x15c, 0xdc, 0x1dc,
|
|
||||||
0x3c, 0x13c, 0xbc, 0x1bc, 0x7c, 0x17c, 0xfc,
|
|
||||||
0x1fc, 0x2, 0x102, 0x82, 0x182, 0x42, 0x142,
|
|
||||||
0xc2, 0x1c2, 0x22, 0x122, 0xa2, 0x1a2, 0x62,
|
|
||||||
0x162, 0xe2, 0x1e2, 0x12, 0x112, 0x92, 0x192,
|
|
||||||
0x52, 0x152, 0xd2, 0x1d2, 0x32, 0x132, 0xb2,
|
|
||||||
0x1b2, 0x72, 0x172, 0xf2, 0x1f2, 0xa, 0x10a,
|
|
||||||
0x8a, 0x18a, 0x4a, 0x14a, 0xca, 0x1ca, 0x2a,
|
|
||||||
0x12a, 0xaa, 0x1aa, 0x6a, 0x16a, 0xea, 0x1ea,
|
|
||||||
0x1a, 0x11a, 0x9a, 0x19a, 0x5a, 0x15a, 0xda,
|
|
||||||
0x1da, 0x3a, 0x13a, 0xba, 0x1ba, 0x7a, 0x17a,
|
|
||||||
0xfa, 0x1fa, 0x6, 0x106, 0x86, 0x186, 0x46,
|
|
||||||
0x146, 0xc6, 0x1c6, 0x26, 0x126, 0xa6, 0x1a6,
|
|
||||||
0x66, 0x166, 0xe6, 0x1e6, 0x16, 0x116, 0x96,
|
|
||||||
0x196, 0x56, 0x156, 0xd6, 0x1d6, 0x36, 0x136,
|
|
||||||
0xb6, 0x1b6, 0x76, 0x176, 0xf6, 0x1f6, 0xe,
|
|
||||||
0x10e, 0x8e, 0x18e, 0x4e, 0x14e, 0xce, 0x1ce,
|
|
||||||
0x2e, 0x12e, 0xae, 0x1ae, 0x6e, 0x16e, 0xee,
|
|
||||||
0x1ee, 0x1e, 0x11e, 0x9e, 0x19e, 0x5e, 0x15e,
|
|
||||||
0xde, 0x1de, 0x3e, 0x13e, 0xbe, 0x1be, 0x7e,
|
|
||||||
0x17e, 0xfe, 0x1fe, 0x1
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CFFT_CIFFT group
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Q15 table for reciprocal
|
|
||||||
*/
|
|
||||||
const q15_t armRecipTableQ15[64] = {
|
|
||||||
0x7F03, 0x7D13, 0x7B31, 0x795E, 0x7798, 0x75E0,
|
|
||||||
0x7434, 0x7294, 0x70FF, 0x6F76, 0x6DF6, 0x6C82,
|
|
||||||
0x6B16, 0x69B5, 0x685C, 0x670C, 0x65C4, 0x6484,
|
|
||||||
0x634C, 0x621C, 0x60F3, 0x5FD0, 0x5EB5, 0x5DA0,
|
|
||||||
0x5C91, 0x5B88, 0x5A85, 0x5988, 0x5890, 0x579E,
|
|
||||||
0x56B0, 0x55C8, 0x54E4, 0x5405, 0x532B, 0x5255,
|
|
||||||
0x5183, 0x50B6, 0x4FEC, 0x4F26, 0x4E64, 0x4DA6,
|
|
||||||
0x4CEC, 0x4C34, 0x4B81, 0x4AD0, 0x4A23, 0x4978,
|
|
||||||
0x48D1, 0x482D, 0x478C, 0x46ED, 0x4651, 0x45B8,
|
|
||||||
0x4521, 0x448D, 0x43FC, 0x436C, 0x42DF, 0x4255,
|
|
||||||
0x41CC, 0x4146, 0x40C2, 0x4040
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Q31 table for reciprocal
|
|
||||||
*/
|
|
||||||
const q31_t armRecipTableQ31[64] = {
|
|
||||||
0x7F03F03F, 0x7D137420, 0x7B31E739, 0x795E9F94, 0x7798FD29, 0x75E06928,
|
|
||||||
0x7434554D, 0x72943B4B, 0x70FF9C40, 0x6F760031, 0x6DF6F593, 0x6C8210E3,
|
|
||||||
0x6B16EC3A, 0x69B526F6, 0x685C655F, 0x670C505D, 0x65C4952D, 0x6484E519,
|
|
||||||
0x634CF53E, 0x621C7E4F, 0x60F33C61, 0x5FD0EEB3, 0x5EB55785, 0x5DA03BEB,
|
|
||||||
0x5C9163A1, 0x5B8898E6, 0x5A85A85A, 0x598860DF, 0x58909373, 0x579E1318,
|
|
||||||
0x56B0B4B8, 0x55C84F0B, 0x54E4BA80, 0x5405D124, 0x532B6E8F, 0x52556FD0,
|
|
||||||
0x5183B35A, 0x50B618F3, 0x4FEC81A2, 0x4F26CFA2, 0x4E64E64E, 0x4DA6AA1D,
|
|
||||||
0x4CEC008B, 0x4C34D010, 0x4B810016, 0x4AD078EF, 0x4A2323C4, 0x4978EA96,
|
|
||||||
0x48D1B827, 0x482D77FE, 0x478C1657, 0x46ED801D, 0x4651A2E5, 0x45B86CE2,
|
|
||||||
0x4521CCE1, 0x448DB244, 0x43FC0CFA, 0x436CCD78, 0x42DFE4B4, 0x42554426,
|
|
||||||
0x41CCDDB6, 0x4146A3C6, 0x40C28923, 0x40408102
|
|
||||||
};
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_conj_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex conjugate.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_conj Complex Conjugate
|
|
||||||
*
|
|
||||||
* Conjugates the elements of a complex data vector.
|
|
||||||
*
|
|
||||||
* The <code>pSrc</code> points to the source data and
|
|
||||||
* <code>pDst</code> points to the where the result should be written.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* and the data in each array is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* Each array has a total of <code>2*numSamples</code> values.
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[(2*n)+0)] = pSrc[(2*n)+0]; // real part
|
|
||||||
* pDst[(2*n)+1)] = -pSrc[(2*n)+1]; // imag part
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_conj
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex conjugate.
|
|
||||||
* @param *pSrc points to the input vector
|
|
||||||
* @param *pDst points to the output vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_conj_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut + j (imagOut) = realIn + j (-1) imagIn */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_conj group
|
|
||||||
*/
|
|
||||||
-123
@@ -1,123 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_conj_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex conjugate.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_conj
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex conjugate.
|
|
||||||
* @param *pSrc points to the input vector
|
|
||||||
* @param *pDst points to the output vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_conj_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut + j (imagOut) = realIn+ j (-1) imagIn */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_conj group
|
|
||||||
*/
|
|
||||||
-131
@@ -1,131 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_conj_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex conjugate.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_conj
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex conjugate.
|
|
||||||
* @param *pSrc points to the input vector
|
|
||||||
* @param *pDst points to the output vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_conj_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
q31_t in; /* Input value */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
/* Saturated to 0x7fffffff if the input is -1(0x80000000) */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
/* Saturated to 0x7fffffff if the input is -1(0x80000000) */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut + j (imagOut) = realIn+ j (-1) imagIn */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_conj group
|
|
||||||
*/
|
|
||||||
-157
@@ -1,157 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_dot_prod_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex dot product
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_dot_prod Complex Dot Product
|
|
||||||
*
|
|
||||||
* Computes the dot product of two complex vectors.
|
|
||||||
* The vectors are multiplied element-by-element and then summed.
|
|
||||||
*
|
|
||||||
* The <code>pSrcA</code> points to the first complex input vector and
|
|
||||||
* <code>pSrcB</code> points to the second complex input vector.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* and the data in each array is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* Each array has a total of <code>2*numSamples</code> values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
* <pre>
|
|
||||||
* realResult=0;
|
|
||||||
* imagResult=0;
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* realResult += pSrcA[(2*n)+0]*pSrcB[(2*n)+0] - pSrcA[(2*n)+1]*pSrcB[(2*n)+1];
|
|
||||||
* imagResult += pSrcA[(2*n)+0]*pSrcB[(2*n)+1] + pSrcA[(2*n)+1]*pSrcB[(2*n)+0];
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex dot product
|
|
||||||
* @param *pSrcA points to the first input vector
|
|
||||||
* @param *pSrcB points to the second input vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @param *realResult real part of the result returned here
|
|
||||||
* @param *imagResult imaginary part of the result returned here
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_dot_prod_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
uint32_t numSamples,
|
|
||||||
float32_t * realResult,
|
|
||||||
float32_t * imagResult)
|
|
||||||
{
|
|
||||||
float32_t real_sum = 0.0f, imag_sum = 0.0f; /* Temporary result storage */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the real and imaginary results in the destination buffers */
|
|
||||||
*realResult = real_sum;
|
|
||||||
*imagResult = imag_sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_dot_prod group
|
|
||||||
*/
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_dot_prod_q15.c
|
|
||||||
*
|
|
||||||
* Description: Processing function for the Q15 Complex Dot product
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex dot product
|
|
||||||
* @param *pSrcA points to the first input vector
|
|
||||||
* @param *pSrcB points to the second input vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @param *realResult real part of the result returned here
|
|
||||||
* @param *imagResult imaginary part of the result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function is implemented using an internal 64-bit accumulator.
|
|
||||||
* The intermediate 1.15 by 1.15 multiplications are performed with full precision and yield a 2.30 result.
|
|
||||||
* These are accumulated in a 64-bit accumulator with 34.30 precision.
|
|
||||||
* As a final step, the accumulators are converted to 8.24 format.
|
|
||||||
* The return results <code>realResult</code> and <code>imagResult</code> are in 8.24 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_dot_prod_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
uint32_t numSamples,
|
|
||||||
q31_t * realResult,
|
|
||||||
q31_t * imagResult)
|
|
||||||
{
|
|
||||||
q63_t real_sum = 0, imag_sum = 0; /* Temporary result storage */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the real and imaginary results in 8.24 format */
|
|
||||||
/* Convert real data in 34.30 to 8.24 by 6 right shifts */
|
|
||||||
*realResult = (q31_t) (real_sum) >> 6;
|
|
||||||
/* Convert imaginary data in 34.30 to 8.24 by 6 right shifts */
|
|
||||||
*imagResult = (q31_t) (imag_sum) >> 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_dot_prod group
|
|
||||||
*/
|
|
||||||
-142
@@ -1,142 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_dot_prod_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex dot product
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex dot product
|
|
||||||
* @param *pSrcA points to the first input vector
|
|
||||||
* @param *pSrcB points to the second input vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @param *realResult real part of the result returned here
|
|
||||||
* @param *imagResult imaginary part of the result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function is implemented using an internal 64-bit accumulator.
|
|
||||||
* The intermediate 1.31 by 1.31 multiplications are performed with 64-bit precision and then shifted to 16.48 format.
|
|
||||||
* The internal real and imaginary accumulators are in 16.48 format and provide 15 guard bits.
|
|
||||||
* Additions are nonsaturating and no overflow will occur as long as <code>numSamples</code> is less than 32768.
|
|
||||||
* The return results <code>realResult</code> and <code>imagResult</code> are in 16.48 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_dot_prod_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
uint32_t numSamples,
|
|
||||||
q63_t * realResult,
|
|
||||||
q63_t * imagResult)
|
|
||||||
{
|
|
||||||
q63_t real_sum = 0, imag_sum = 0; /* Temporary result storage */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
/* Convert real data in 2.62 to 16.48 by 14 right shifts */
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
/* Convert imag data in 2.62 to 16.48 by 14 right shifts */
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* outReal = realA[0]* realB[0] + realA[2]* realB[2] + realA[4]* realB[4] + .....+ realA[numSamples-2]* realB[numSamples-2] */
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
/* outImag = imagA[1]* imagB[1] + imagA[3]* imagB[3] + imagA[5]* imagB[5] + .....+ imagA[numSamples-1]* imagB[numSamples-1] */
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the real and imaginary results in 16.48 format */
|
|
||||||
*realResult = real_sum;
|
|
||||||
*imagResult = imag_sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_dot_prod group
|
|
||||||
*/
|
|
||||||
-154
@@ -1,154 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex magnitude.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_mag Complex Magnitude
|
|
||||||
*
|
|
||||||
* Computes the magnitude of the elements of a complex data vector.
|
|
||||||
*
|
|
||||||
* The <code>pSrc</code> points to the source data and
|
|
||||||
* <code>pDst</code> points to the where the result should be written.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* in the input array and the data is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The input array has a total of <code>2*numSamples</code> values;
|
|
||||||
* the output array has a total of <code>numSamples</code> values.
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[n] = sqrt(pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2);
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex magnitude.
|
|
||||||
* @param[in] *pSrc points to complex input buffer
|
|
||||||
* @param[out] *pDst points to real output buffer
|
|
||||||
* @param[in] numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_cmplx_mag_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t realIn, imagIn; /* Temporary variables to hold input values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = sqrt((real * real) + (imag * imag)) */
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag group
|
|
||||||
*/
|
|
||||||
-153
@@ -1,153 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex magnitude.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex magnitude
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.15 by 1.15 multiplications and finally output is converted into 2.14 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t real, imag; /* Temporary variables to hold input values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = sqrt(real * real + imag * imag) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
|
|
||||||
acc0 = (real * real);
|
|
||||||
acc1 = (imag * imag);
|
|
||||||
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag group
|
|
||||||
*/
|
|
||||||
-151
@@ -1,151 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex magnitude
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex magnitude
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.31 by 1.31 multiplications and finally output is converted into 2.30 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t real, imag; /* Temporary variables to hold input values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = sqrt((real * real) + (imag * imag)) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag group
|
|
||||||
*/
|
|
||||||
-155
@@ -1,155 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_squared_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex magnitude squared.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_mag_squared Complex Magnitude Squared
|
|
||||||
*
|
|
||||||
* Computes the magnitude squared of the elements of a complex data vector.
|
|
||||||
*
|
|
||||||
* The <code>pSrc</code> points to the source data and
|
|
||||||
* <code>pDst</code> points to the where the result should be written.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* in the input array and the data is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The input array has a total of <code>2*numSamples</code> values;
|
|
||||||
* the output array has a total of <code>numSamples</code> values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[n] = pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2;
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag_squared
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex magnitude squared
|
|
||||||
* @param[in] *pSrc points to the complex input vector
|
|
||||||
* @param[out] *pDst points to the real output vector
|
|
||||||
* @param[in] numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_squared_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t real, imag; /* Temporary variables to store real and imaginary values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* reading real and imaginary values */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
|
|
||||||
/* out = (real * real) + (imag * imag) */
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag_squared group
|
|
||||||
*/
|
|
||||||
-148
@@ -1,148 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_squared_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex magnitude squared.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag_squared
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex magnitude squared
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_squared_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t real, imag; /* Temporary variables to store real and imaginary values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = ((real * real) + (imag * imag)) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (real * real);
|
|
||||||
acc1 = (imag * imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag_squared group
|
|
||||||
*/
|
|
||||||
-150
@@ -1,150 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_squared_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex magnitude squared.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag_squared
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex magnitude squared
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_squared_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t real, imag; /* Temporary variables to store real and imaginary values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = ((real * real) + (imag * imag)) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag_squared group
|
|
||||||
*/
|
|
||||||
-180
@@ -1,180 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_cmplx_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex-by-complex multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup CmplxByCmplxMult Complex-by-Complex Multiplication
|
|
||||||
*
|
|
||||||
* Multiplies a complex vector by another complex vector and generates a complex result.
|
|
||||||
* The data in the complex arrays is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The parameter <code>numSamples</code> represents the number of complex
|
|
||||||
* samples processed. The complex arrays have a total of <code>2*numSamples</code>
|
|
||||||
* real values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[(2*n)+0] = pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];
|
|
||||||
* pDst[(2*n)+1] = pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByCmplxMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex-by-complex multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_cmplx_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t a, b, c, d; /* Temporary variables to store real and imaginary values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByCmplxMult group
|
|
||||||
*/
|
|
||||||
-182
@@ -1,182 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_cmplx_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex-by-complex multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByCmplxMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex-by-complex multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_cmplx_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t a, b, c, d; /* Temporary variables to store real and imaginary values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByCmplxMult group
|
|
||||||
*/
|
|
||||||
-209
@@ -1,209 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_cmplx_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex-by-complex multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByCmplxMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex-by-complex multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_cmplx_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t a, b, c, d; /* Temporary variables to store real and imaginary values */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the real result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the imag result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 1u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 2 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 sample. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the real result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the imag result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 2, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x2u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByCmplxMult group
|
|
||||||
*/
|
|
||||||
-157
@@ -1,157 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_real_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex by real multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup CmplxByRealMult Complex-by-Real Multiplication
|
|
||||||
*
|
|
||||||
* Multiplies a complex vector by a real vector and generates a complex result.
|
|
||||||
* The data in the complex arrays is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The parameter <code>numSamples</code> represents the number of complex
|
|
||||||
* samples processed. The complex arrays have a total of <code>2*numSamples</code>
|
|
||||||
* real values while the real array has a total of <code>numSamples</code>
|
|
||||||
* real values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];
|
|
||||||
* pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByRealMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex-by-real multiplication
|
|
||||||
* @param[in] *pSrcCmplx points to the complex input vector
|
|
||||||
* @param[in] *pSrcReal points to the real input vector
|
|
||||||
* @param[out] *pCmplxDst points to the complex output vector
|
|
||||||
* @param[in] numSamples number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_real_f32(
|
|
||||||
float32_t * pSrcCmplx,
|
|
||||||
float32_t * pSrcReal,
|
|
||||||
float32_t * pCmplxDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t in; /* Temporary variable to store input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut = realA * realB. */
|
|
||||||
/* imagOut = imagA * realB. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByRealMult group
|
|
||||||
*/
|
|
||||||
-151
@@ -1,151 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_real_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex by real multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByRealMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex-by-real multiplication
|
|
||||||
* @param[in] *pSrcCmplx points to the complex input vector
|
|
||||||
* @param[in] *pSrcReal points to the real input vector
|
|
||||||
* @param[out] *pCmplxDst points to the complex output vector
|
|
||||||
* @param[in] numSamples number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_real_q15(
|
|
||||||
q15_t * pSrcCmplx,
|
|
||||||
q15_t * pSrcReal,
|
|
||||||
q15_t * pCmplxDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t in; /* Temporary variable to store input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut = realA * realB. */
|
|
||||||
/* imagOut = imagA * realB. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByRealMult group
|
|
||||||
*/
|
|
||||||
-151
@@ -1,151 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_real_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex by real multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByRealMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex-by-real multiplication
|
|
||||||
* @param[in] *pSrcCmplx points to the complex input vector
|
|
||||||
* @param[in] *pSrcReal points to the real input vector
|
|
||||||
* @param[out] *pCmplxDst points to the complex output vector
|
|
||||||
* @param[in] numSamples number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_real_q31(
|
|
||||||
q31_t * pSrcCmplx,
|
|
||||||
q31_t * pSrcReal,
|
|
||||||
q31_t * pCmplxDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t in; /* Temporary variable to store input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut = realA * realB. */
|
|
||||||
/* imagReal = imagA * realB. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByRealMult group
|
|
||||||
*/
|
|
||||||
-76
@@ -1,76 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_init_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point PID Control initialization function
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialization function for the floating-point PID Control.
|
|
||||||
* @param[in,out] *S points to an instance of the PID structure.
|
|
||||||
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state & 1 = reset the state.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* \par
|
|
||||||
* The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n
|
|
||||||
* The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>
|
|
||||||
* using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)
|
|
||||||
* also sets the state variables to all zeros.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_pid_init_f32(
|
|
||||||
arm_pid_instance_f32 * S,
|
|
||||||
int32_t resetStateFlag)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
S->A0 = S->Kp + S->Ki + S->Kd;
|
|
||||||
|
|
||||||
/* Derived coefficient A1 */
|
|
||||||
S->A1 = (-S->Kp) - ((float32_t) 2.0 * S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficient A2 */
|
|
||||||
S->A2 = S->Kd;
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(float32_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-111
@@ -1,111 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_init_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 PID Control initialization function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @details
|
|
||||||
* @param[in,out] *S points to an instance of the Q15 PID structure.
|
|
||||||
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* \par
|
|
||||||
* The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n
|
|
||||||
* The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>
|
|
||||||
* using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)
|
|
||||||
* also sets the state variables to all zeros.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_pid_init_q15(
|
|
||||||
arm_pid_instance_q15 * S,
|
|
||||||
int32_t resetStateFlag)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
S->A0 = __QADD16(__QADD16(S->Kp, S->Ki), S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficients and pack into A1 */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
S->A1 = __PKHBT(-__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), S->Kd, 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
S->A1 = __PKHBT(S->Kd, -__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q15_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q31_t temp; /*to store the sum */
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
temp = S->Kp + S->Ki + S->Kd;
|
|
||||||
S->A0 = (q15_t) __SSAT(temp, 16);
|
|
||||||
|
|
||||||
/* Derived coefficients and pack into A1 */
|
|
||||||
temp = -(S->Kd + S->Kd + S->Kp);
|
|
||||||
S->A1 = (q15_t) __SSAT(temp, 16);
|
|
||||||
S->A2 = S->Kd;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q15_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-96
@@ -1,96 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_init_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 PID Control initialization function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialization function for the Q31 PID Control.
|
|
||||||
* @param[in,out] *S points to an instance of the Q31 PID structure.
|
|
||||||
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* \par
|
|
||||||
* The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n
|
|
||||||
* The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>
|
|
||||||
* using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)
|
|
||||||
* also sets the state variables to all zeros.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_pid_init_q31(
|
|
||||||
arm_pid_instance_q31 * S,
|
|
||||||
int32_t resetStateFlag)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
S->A0 = __QADD(__QADD(S->Kp, S->Ki), S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficient A1 */
|
|
||||||
S->A1 = -__QADD(__QADD(S->Kd, S->Kd), S->Kp);
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q31_t temp;
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
temp = clip_q63_to_q31((q63_t) S->Kp + S->Ki);
|
|
||||||
S->A0 = clip_q63_to_q31((q63_t) temp + S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficient A1 */
|
|
||||||
temp = clip_q63_to_q31((q63_t) S->Kd + S->Kd);
|
|
||||||
S->A1 = -clip_q63_to_q31((q63_t) temp + S->Kp);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Derived coefficient A2 */
|
|
||||||
S->A2 = S->Kd;
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q31_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-54
@@ -1,54 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_reset_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point PID Control reset function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* Version 1.0.2 2010/11/11
|
|
||||||
* Documentation updated.
|
|
||||||
*
|
|
||||||
* Version 1.0.1 2010/10/05
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
*
|
|
||||||
* Version 1.0.0 2010/09/20
|
|
||||||
* Production release and review comments incorporated.
|
|
||||||
* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Reset function for the floating-point PID Control.
|
|
||||||
* @param[in] *S Instance pointer of PID control data structure.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* The function resets the state buffer to zeros.
|
|
||||||
*/
|
|
||||||
void arm_pid_reset_f32(
|
|
||||||
arm_pid_instance_f32 * S)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(float32_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user