spcore 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog.rdoc +5 -1
- data/lib/spcore/core/delay_line.rb +1 -1
- data/lib/spcore/core/envelope_detector.rb +1 -1
- data/lib/spcore/core/oscillator.rb +5 -5
- data/lib/spcore/core/signal.rb +1 -1
- data/lib/spcore/filters/fir/dual_sinc_filter.rb +5 -5
- data/lib/spcore/filters/fir/fir.rb +1 -1
- data/lib/spcore/filters/fir/sinc_filter.rb +3 -3
- data/lib/spcore/resampling/discrete_resampling.rb +2 -2
- data/lib/spcore/util/signal_generator.rb +1 -1
- data/lib/spcore/version.rb +1 -1
- data/spec/core/delay_line_spec.rb +1 -1
- data/spec/core/envelope_detector_spec.rb +1 -1
- data/spec/core/oscillator_spec.rb +2 -2
- data/spec/filters/fir/dual_sinc_filter_spec.rb +1 -1
- data/spec/filters/fir/sinc_filter_spec.rb +1 -1
- data/spec/filters/iir/cookbook_filter_spec.rb +1 -1
- data/spec/resampling/discrete_resampling_spec.rb +3 -3
- data/spec/resampling/hybrid_resampling_spec.rb +1 -1
- data/spec/resampling/polynomial_resampling_spec.rb +1 -1
- data/spec/transforms/dft_spec.rb +2 -2
- data/spec/transforms/fft_spec.rb +2 -2
- data/spec/util/saturate_spec.rb +2 -2
- data/spec/util/signal_generator_spec.rb +1 -1
- metadata +4 -4
data/ChangeLog.rdoc
CHANGED
@@ -9,7 +9,7 @@ class DelayLine
|
|
9
9
|
|
10
10
|
# Used to process hashed arguments in #initialize.
|
11
11
|
ARG_SPECS = {
|
12
|
-
:sample_rate => arg_spec(:reqd => true, :type =>
|
12
|
+
:sample_rate => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0.0 } ),
|
13
13
|
:max_delay_seconds => arg_spec(:reqd => true, :type => Float, :validator => ->(a){ (a > 0.0) } ),
|
14
14
|
:delay_seconds => arg_spec(:reqd => false, :type => Float, :default => 0.0, :validator => ->(a){ a >= 0.0 } ),
|
15
15
|
}
|
@@ -7,7 +7,7 @@ class EnvelopeDetector
|
|
7
7
|
|
8
8
|
# Used to process hashed arguments in #initialize.
|
9
9
|
ARG_SPECS = {
|
10
|
-
:sample_rate => arg_spec(:reqd => true, :type =>
|
10
|
+
:sample_rate => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0.0 } ),
|
11
11
|
:attack_time => arg_spec(:reqd => true, :type => Float, :validator => ->(a){ a > 0.0 } ),
|
12
12
|
:release_time => arg_spec(:reqd => true, :type => Float, :validator => ->(a){ a > 0.0 } ),
|
13
13
|
}
|
@@ -22,12 +22,12 @@ class Oscillator
|
|
22
22
|
|
23
23
|
# Used to process hashed arguments in #initialize.
|
24
24
|
ARG_SPECS = {
|
25
|
-
:sample_rate => arg_spec(:reqd => true, :type =>
|
25
|
+
:sample_rate => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0 } ),
|
26
26
|
:wave_type => arg_spec(:reqd => false, :type => Symbol, :default => WAVE_SINE, :validator => ->(a){ WAVES.include? a } ),
|
27
|
-
:frequency => arg_spec(:reqd => false, :type =>
|
28
|
-
:amplitude => arg_spec(:reqd => false, :type =>
|
29
|
-
:phase_offset => arg_spec(:reqd => false, :type =>
|
30
|
-
:dc_offset => arg_spec(:reqd => false, :type =>
|
27
|
+
:frequency => arg_spec(:reqd => false, :type => Numeric, :default => 1.0, :validator => ->(a){ a > 0.0 } ),
|
28
|
+
:amplitude => arg_spec(:reqd => false, :type => Numeric, :default => 1.0 ),
|
29
|
+
:phase_offset => arg_spec(:reqd => false, :type => Numeric, :default => 0.0 ),
|
30
|
+
:dc_offset => arg_spec(:reqd => false, :type => Numeric, :default => 0.0 ),
|
31
31
|
}
|
32
32
|
|
33
33
|
# A new instance of Oscillator. The controllable wave parameters are frequency,
|
data/lib/spcore/core/signal.rb
CHANGED
@@ -9,7 +9,7 @@ class Signal
|
|
9
9
|
# Used to process hashed arguments in #initialize.
|
10
10
|
ARG_SPECS = {
|
11
11
|
:data => arg_spec(:reqd => true, :type => Array, :validator => ->(a){ a.any? }),
|
12
|
-
:sample_rate => arg_spec(:reqd => true, :type =>
|
12
|
+
:sample_rate => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0.0 })
|
13
13
|
}
|
14
14
|
|
15
15
|
attr_reader :data, :sample_rate
|
@@ -13,7 +13,7 @@ class DualSincFilter
|
|
13
13
|
# Use to process hashed args in #initialize.
|
14
14
|
ARG_SPECS = {
|
15
15
|
:order => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a % 2 == 0 } ),
|
16
|
-
:sample_rate => arg_spec(:reqd => true, :type =>
|
16
|
+
:sample_rate => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0.0 } ),
|
17
17
|
:left_cutoff_freq => arg_spec(:reqd => true, :type => Numeric, :validator => ->(a){ a > 0.0 } ),
|
18
18
|
:right_cutoff_freq => arg_spec(:reqd => true, :type => Numeric, :validator => ->(a){ a > 0.0 } ),
|
19
19
|
:window_class => arg_spec(:reqd => false, :type => Class, :default => BlackmanWindow ),
|
@@ -26,8 +26,8 @@ class DualSincFilter
|
|
26
26
|
def initialize args
|
27
27
|
hash_make DualSincFilter::ARG_SPECS, args
|
28
28
|
|
29
|
-
raise ArgumentError, "left_cutoff_freq is greater than 0.5 * sample_rate" if @left_cutoff_freq > (@sample_rate
|
30
|
-
raise ArgumentError, "right_cutoff_freq is greater than 0.5 * sample_rate" if @right_cutoff_freq > (@sample_rate
|
29
|
+
raise ArgumentError, "left_cutoff_freq is greater than 0.5 * sample_rate" if @left_cutoff_freq > (@sample_rate * 0.5)
|
30
|
+
raise ArgumentError, "right_cutoff_freq is greater than 0.5 * sample_rate" if @right_cutoff_freq > (@sample_rate * 0.5)
|
31
31
|
raise ArgumentError, "left_cutoff_freq is not less than right_cutoff_freq" unless @left_cutoff_freq < @right_cutoff_freq
|
32
32
|
|
33
33
|
@left_filter = SincFilter.new(
|
@@ -57,8 +57,8 @@ class DualSincFilter
|
|
57
57
|
bandstop_kernel[size - 1 - n] = bandstop_kernel[n] = @left_filter.lowpass_fir.kernel[n] + @right_filter.highpass_fir.kernel[n]
|
58
58
|
end
|
59
59
|
|
60
|
-
left_transition_freq = @left_cutoff_freq / @sample_rate
|
61
|
-
right_transition_freq = @right_cutoff_freq / @sample_rate
|
60
|
+
left_transition_freq = @left_cutoff_freq.to_f / @sample_rate
|
61
|
+
right_transition_freq = @right_cutoff_freq.to_f / @sample_rate
|
62
62
|
bw_times_two = 2.0 * (right_transition_freq - left_transition_freq)
|
63
63
|
window_center_val = window.data[@order / 2]
|
64
64
|
|
@@ -14,7 +14,7 @@ class SincFilter
|
|
14
14
|
# Use to process hashed args in #initialize.
|
15
15
|
ARG_SPECS = {
|
16
16
|
:order => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a % 2 == 0 } ),
|
17
|
-
:sample_rate => arg_spec(:reqd => true, :type =>
|
17
|
+
:sample_rate => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0 } ),
|
18
18
|
:cutoff_freq => arg_spec(:reqd => true, :type => Numeric, :validator => ->(a){ a > 0.0 } ),
|
19
19
|
:window_class => arg_spec(:reqd => false, :type => Class, :default => BlackmanWindow ),
|
20
20
|
}
|
@@ -26,10 +26,10 @@ class SincFilter
|
|
26
26
|
def initialize args
|
27
27
|
hash_make SincFilter::ARG_SPECS, args
|
28
28
|
|
29
|
-
raise ArgumentError, "cutoff_freq is greater than 0.5 * sample_rate" if @cutoff_freq > (@sample_rate / 2)
|
29
|
+
raise ArgumentError, "cutoff_freq is greater than 0.5 * sample_rate" if @cutoff_freq > (@sample_rate / 2.0)
|
30
30
|
|
31
31
|
size = @order + 1
|
32
|
-
transition_freq = @cutoff_freq / @sample_rate
|
32
|
+
transition_freq = @cutoff_freq.to_f / @sample_rate
|
33
33
|
b = TWO_PI * transition_freq
|
34
34
|
|
35
35
|
# make FIR filter kernels for lowpass and highpass
|
@@ -17,7 +17,7 @@ class DiscreteResampling
|
|
17
17
|
filter = SincFilter.new(
|
18
18
|
:sample_rate => (sample_rate * upsample_factor),
|
19
19
|
:order => filter_order,
|
20
|
-
:cutoff_freq => (sample_rate / 2),
|
20
|
+
:cutoff_freq => (sample_rate / 2.0),
|
21
21
|
:window_class => NuttallWindow
|
22
22
|
)
|
23
23
|
|
@@ -37,7 +37,7 @@ class DiscreteResampling
|
|
37
37
|
|
38
38
|
filter = SincFilter.new(
|
39
39
|
:sample_rate => sample_rate, :order => filter_order,
|
40
|
-
:cutoff_freq => ((sample_rate / downsample_factor) / 2.0),
|
40
|
+
:cutoff_freq => ((sample_rate.to_f / downsample_factor) / 2.0),
|
41
41
|
:window_class => NuttallWindow
|
42
42
|
)
|
43
43
|
|
@@ -6,7 +6,7 @@ class SignalGenerator
|
|
6
6
|
# used to process hashed args in #initialize.
|
7
7
|
ARG_SPECS = {
|
8
8
|
:size => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0 }),
|
9
|
-
:sample_rate => arg_spec(:reqd => true, :type =>
|
9
|
+
:sample_rate => arg_spec(:reqd => true, :type => Fixnum, :validator => ->(a){ a > 0 })
|
10
10
|
}
|
11
11
|
|
12
12
|
attr_reader :sample_rate, :size
|
data/lib/spcore/version.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
3
3
|
describe SPCore::EnvelopeDetector do
|
4
4
|
describe '#process_sample' do
|
5
5
|
it 'should produce an output that follows the amplitude of the input' do
|
6
|
-
sample_rate = 400
|
6
|
+
sample_rate = 400
|
7
7
|
freqs = [20.0, 60.0]
|
8
8
|
|
9
9
|
envelope_start = 1.0
|
@@ -4,7 +4,7 @@ require 'pry'
|
|
4
4
|
|
5
5
|
describe SPCore::Oscillator do
|
6
6
|
#it 'should look like a ...' do
|
7
|
-
# sample_rate = 44000
|
7
|
+
# sample_rate = 44000
|
8
8
|
# test_freq = 100.0
|
9
9
|
# osc = SPCore::Oscillator.new :sample_rate => sample_rate, :frequency => test_freq, :wave_type => SPCore::Oscillator::WAVE_SQUARE
|
10
10
|
# N = (5 * sample_rate / test_freq).to_i
|
@@ -32,7 +32,7 @@ describe SPCore::Oscillator do
|
|
32
32
|
#end
|
33
33
|
|
34
34
|
before :each do
|
35
|
-
@sample_rate = 40000
|
35
|
+
@sample_rate = 40000
|
36
36
|
@freqs = [ 20.0, 200.0, 400.0 ]
|
37
37
|
end
|
38
38
|
|
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
3
3
|
|
4
4
|
describe SPCore::SincFilter do
|
5
5
|
before :all do
|
6
|
-
@sample_rate = 4000
|
6
|
+
@sample_rate = 4000
|
7
7
|
@orders = [62]
|
8
8
|
@left_cutoffs = Scale.exponential 300.0..1500.0, 3
|
9
9
|
@right_cutoffs = Scale.exponential 400.0..1600.0, 3
|
@@ -5,7 +5,7 @@ describe SPCore::DiscreteResampling do
|
|
5
5
|
|
6
6
|
context '.upsample' do
|
7
7
|
it 'should produce output signal with the same max frequency (put through forward FFT)' do
|
8
|
-
sample_rate = 400
|
8
|
+
sample_rate = 400
|
9
9
|
test_freq = 10.0
|
10
10
|
size = 64
|
11
11
|
upsample_factor = 4
|
@@ -30,7 +30,7 @@ describe SPCore::DiscreteResampling do
|
|
30
30
|
|
31
31
|
context '.downsample' do
|
32
32
|
it 'should produce output signal with the same max frequency (put through forward FFT)' do
|
33
|
-
sample_rate = 400
|
33
|
+
sample_rate = 400
|
34
34
|
test_freq = 10.0
|
35
35
|
size = 128
|
36
36
|
downsample_factor = 4
|
@@ -55,7 +55,7 @@ describe SPCore::DiscreteResampling do
|
|
55
55
|
|
56
56
|
context '.resample' do
|
57
57
|
it 'should produce output signal with the same max frequency (put through forward FFT)' do
|
58
|
-
sample_rate = 400
|
58
|
+
sample_rate = 400
|
59
59
|
test_freq = 10.0
|
60
60
|
size = 64
|
61
61
|
upsample_factor = 4
|
@@ -5,7 +5,7 @@ describe SPCore::PolynomialResampling do
|
|
5
5
|
|
6
6
|
context '.upsample' do
|
7
7
|
it 'should produce output signal with the same max frequency (put through forward DFT)' do
|
8
|
-
sample_rate = 400
|
8
|
+
sample_rate = 400
|
9
9
|
test_freq = 10.0
|
10
10
|
size = (sample_rate * 5.0 / test_freq).to_i
|
11
11
|
upsample_factor = 2.5
|
data/spec/transforms/dft_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe SPCore::DFT do
|
|
7
7
|
|
8
8
|
it 'should produce a freq magnitude response peak that is within 10 percent of the test freq' do
|
9
9
|
dft_size = 64
|
10
|
-
sample_rate = 400
|
10
|
+
sample_rate = 400
|
11
11
|
|
12
12
|
test_freqs = [
|
13
13
|
20.0,
|
@@ -39,7 +39,7 @@ describe SPCore::DFT do
|
|
39
39
|
|
40
40
|
it 'should produce a near-identical signal to the original sent into the forward DFT (with energy that is within 10 percent error of original signal)' do
|
41
41
|
dft_size = 32
|
42
|
-
sample_rate = 400
|
42
|
+
sample_rate = 400
|
43
43
|
|
44
44
|
test_freqs = [
|
45
45
|
20.0,
|
data/spec/transforms/fft_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe SPCore::FFT do
|
|
6
6
|
context '.forward' do
|
7
7
|
it 'should produce a freq magnitude response peak that is within 10 percent of the test freq' do
|
8
8
|
fft_size = 64
|
9
|
-
sample_rate = 400
|
9
|
+
sample_rate = 400
|
10
10
|
|
11
11
|
test_freqs = [
|
12
12
|
20.0,
|
@@ -52,7 +52,7 @@ describe SPCore::FFT do
|
|
52
52
|
|
53
53
|
it 'should produce a near-identical signal to the original sent into the forward DFT (with energy that is within 10 percent error of original signal)' do
|
54
54
|
fft_size = 32
|
55
|
-
sample_rate = 400
|
55
|
+
sample_rate = 400
|
56
56
|
|
57
57
|
test_freqs = [
|
58
58
|
20.0,
|
data/spec/util/saturate_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe SPCore::Saturation do
|
|
11
11
|
z_data = []
|
12
12
|
|
13
13
|
osc = SPCore::Oscillator.new(
|
14
|
-
:sample_rate => 100
|
14
|
+
:sample_rate => 100,
|
15
15
|
:frequency => 1.0,
|
16
16
|
:wave_type => SPCore::Oscillator::WAVE_SINE,
|
17
17
|
:amplitude => 2.5
|
@@ -62,7 +62,7 @@ describe SPCore::Saturation do
|
|
62
62
|
y_data = []
|
63
63
|
z_data = []
|
64
64
|
|
65
|
-
osc = SPCore::Oscillator.new :sample_rate => 100
|
65
|
+
osc = SPCore::Oscillator.new :sample_rate => 100, :frequency => 1.0, :wave_type => SPCore::Oscillator::WAVE_SINE, :amplitude => 2.5
|
66
66
|
(4 * osc.sample_rate / osc.frequency).to_i.times do |n|
|
67
67
|
x = n / osc.sample_rate
|
68
68
|
y = osc.sample
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spcore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hashmake
|
@@ -222,7 +222,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
222
222
|
version: '0'
|
223
223
|
segments:
|
224
224
|
- 0
|
225
|
-
hash:
|
225
|
+
hash: 407745007
|
226
226
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
227
|
none: false
|
228
228
|
requirements:
|
@@ -231,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
231
|
version: '0'
|
232
232
|
segments:
|
233
233
|
- 0
|
234
|
-
hash:
|
234
|
+
hash: 407745007
|
235
235
|
requirements: []
|
236
236
|
rubyforge_project:
|
237
237
|
rubygems_version: 1.8.23
|