Programmer Guide/Command Reference/EVAL/hcomb: Difference between revisions

From STX Wiki
Jump to navigationJump to search
(Created page with 'xxxxxx')
 
No edit summary
Line 1: Line 1:
xxxxxx
{{DISPLAYTITLE:{{SUBPAGENAME}}}}
This function implements a methods to detect harmonics in a spectrum and to create a harmonic comb filter. It was especially implemented for the [[Programmer_Guide/BScript#MulAc|script application '''MulAc''']].
 
;Usage:<code>hcomb(<var>mflag</var>, <var>oflag</var>, <var>a</var>, <var>imin</var>, <var>imax</var>, <var>ot</var>, <var>ok</var>, <var>oo</var>, <var>nget</var>, <var>rrms</var>, <var>nrms</var>, <var>nset</var>)</code>
:;<var>mflag</var>:selects the method used to detect the test tone ''ft''
::{|class="keinrahmen"
|''mflag''=0 ||peak picking
|-
|''mflag''=1 ||harmonic grid
|}
:;<var>oflag</var>:selects the format and content of the result (see '''Result'''); the values '''0''' and '''1''' are supported
:;<var>a</var>:a vector containing amplitude spectrum (linear, with constant df); in the description below ''n'' is the length of ''a''.
:;<var>imin, imax</var>index range for test tone (''ft'') detection; 0 <= ''imin'' < ''imax'' < ''n''
:;<var>ot</var>:test tone order (''f0'' = ''ft'' / ''ot''); 0 < ''ot''
:;<var>ok, oo</var>:order factor and offset for the components of the comp ''fc''[i];
::<code>''fc''[i] = ''f0'' * (''oo'' + ''ok''*i); with: i=1,2,...</code>
:;<var>nget</var>:the number of points (+/-) to detect the peak of a harmonic component ''fc''[i]; 3 <= ''nget''
:;<var>rrms</var>:defines the energy ratio threshold for harmonic components; 0 <= ''rrms'' < 1
:;<var>nrms</var>:defines the bandwidth (+/- ''nrms'' points) used to compute the energy ratio; 2 <= ''nrms''
:::(<code>component-rms / testband-rms >= ''rrms''</code>)
:;<var>nset</var>:defines the comb bandwidth (+/- ''nset'' points); if ''nset'' equals 0, a variable comb bandwidth is used to remove the detected components; this argument is only used if ''oflag'' equals '''1'''
:;
 
 
test tone order (''f0'' = ''ft'' / ''ot''); 0 < ''ot''
 
 
 
 
:::<code>mflag(''a'')>2, nrow(''b'')>2, ncol(''a'') = ncol(''b'')</code>
::Each row of ''a''/''b'' defines one parameter value or vector (e.g. for a frame).
;Result:A matrix Nx2 defining the map of the row indices of ''a'' and ''b'' with the minimum accumulated distance. The first column contains the indices for ''a'' and the second column the indices for ''b''.
:Note:To minimize the distance, individual rows of ''a'' or ''b'' are duplicated. Therefore the number of rows of the result matrix N is greater than or equal to <code>max(nrow(''a''),nrow(''b''))</code>.
----
;Usage 2:<code>mapmind(1, <var>m</var>, <var>x</var>)</code>
:;<var>m</var>:A vector containing the index map for ''x'';
:;<var>x</var>:A vector or matrix containing the parameter set to remap.
;Result 2:A vector or matrix ''r'' containing the remapped parameter set ''x''. The number of rows of ''r'' is equal to <code>nrow(''m'')</code> and the number of columns equals <code>ncol(''x'')</code>. The content of the output row <code>''r''[i,*]</code> is a copy of the input row <code>''x''[''m''[i],*]</code>.
----
;See also: [[../dist|dist]]
 
 
Example:
<pre>
// macro "alignAB": nonlinear time alignment of two signals,
//                  using the rms track as alignment parameter
// input:  #rmsA, #rmsB ... rms tracks of signal A and B
// result: #aMat .......... alignment matrix, #aMat[*,0] = index vector for signal A
//                                            #aMat[*,1] = index vector for signal B
//                                            #aMat[*,2] = aligned rms track of signal A
//                                            #aMat[*,3] = aligned rms track of signal B
 
[macro alignAB arg: #rmsA #rmsB]
// compute index map with minimum accumulated distance
#map := eval mapmind(0,$#rmsA,$#rmsB)
// remap rms track of signal A
if $rc == 0 #rmsAA := eval mapmind(1, $#map[*,0], $#rmsA)
// remap rms track of signal B
if $rc == 0 #rmsBB := eval mapmind(1, $#map[*,1], $#rmsB)
// create and return the result matrix
if $rc == 0 exit 1 eval vmcol($#map[*,0], $#map[*,1], $#rmsAA, $#rmsBB)
// this point is reached if one of the above commands fails -> error -> return empty string
exit 1 set ''
</pre>
 
[[../#Functions|<function list>]]

Revision as of 13:00, 20 April 2011

This function implements a methods to detect harmonics in a spectrum and to create a harmonic comb filter. It was especially implemented for the script application MulAc.

Usage
hcomb(mflag, oflag, a, imin, imax, ot, ok, oo, nget, rrms, nrms, nset)
mflag
selects the method used to detect the test tone ft
mflag=0 peak picking
mflag=1 harmonic grid
oflag
selects the format and content of the result (see Result); the values 0 and 1 are supported
a
a vector containing amplitude spectrum (linear, with constant df); in the description below n is the length of a.
imin, imaxindex range for test tone (ft) detection; 0 <= imin < imax < n
ot
test tone order (f0 = ft / ot); 0 < ot
ok, oo
order factor and offset for the components of the comp fc[i];
fc[i] = f0 * (oo + ok*i); with: i=1,2,...
nget
the number of points (+/-) to detect the peak of a harmonic component fc[i]; 3 <= nget
rrms
defines the energy ratio threshold for harmonic components; 0 <= rrms < 1
nrms
defines the bandwidth (+/- nrms points) used to compute the energy ratio; 2 <= nrms
(component-rms / testband-rms >= rrms)
nset
defines the comb bandwidth (+/- nset points); if nset equals 0, a variable comb bandwidth is used to remove the detected components; this argument is only used if oflag equals 1


test tone order (f0 = ft / ot); 0 < ot



mflag(a)>2, nrow(b)>2, ncol(a) = ncol(b)
Each row of a/b defines one parameter value or vector (e.g. for a frame).
Result
A matrix Nx2 defining the map of the row indices of a and b with the minimum accumulated distance. The first column contains the indices for a and the second column the indices for b.
Note:To minimize the distance, individual rows of a or b are duplicated. Therefore the number of rows of the result matrix N is greater than or equal to max(nrow(a),nrow(b)).

Usage 2
mapmind(1, m, x)
m
A vector containing the index map for x;
x
A vector or matrix containing the parameter set to remap.
Result 2
A vector or matrix r containing the remapped parameter set x. The number of rows of r is equal to nrow(m) and the number of columns equals ncol(x). The content of the output row r[i,*] is a copy of the input row x[m[i],*].

See also
dist


Example:

// macro "alignAB": nonlinear time alignment of two signals,
//                  using the rms track as alignment parameter
// input:  #rmsA, #rmsB ... rms tracks of signal A and B
// result: #aMat .......... alignment matrix, #aMat[*,0] = index vector for signal A
//                                            #aMat[*,1] = index vector for signal B
//                                            #aMat[*,2] = aligned rms track of signal A
//                                            #aMat[*,3] = aligned rms track of signal B

[macro alignAB arg: #rmsA #rmsB]
// compute index map with minimum accumulated distance 
#map := eval mapmind(0,$#rmsA,$#rmsB)
// remap rms track of signal A
if $rc == 0 #rmsAA := eval mapmind(1, $#map[*,0], $#rmsA)
// remap rms track of signal B
if $rc == 0 #rmsBB := eval mapmind(1, $#map[*,1], $#rmsB)
// create and return the result matrix
if $rc == 0 exit 1 eval vmcol($#map[*,0], $#map[*,1], $#rmsAA, $#rmsBB)
// this point is reached if one of the above commands fails -> error -> return empty string
exit 1 set ''

<function list>

Navigation menu

Personal tools