mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-10 08:31:34 +00:00
It turns out that the Vic has a 1.6Khz low-pass filter. So added that.
This commit is contained in:
parent
8d839c5278
commit
c783090980
@ -15,7 +15,11 @@ Speaker::Speaker() :
|
|||||||
_control_registers{0, 0, 0, 0},
|
_control_registers{0, 0, 0, 0},
|
||||||
_shift_registers{0, 0, 0, 0},
|
_shift_registers{0, 0, 0, 0},
|
||||||
_counters{2, 1, 0, 0} // create a slight phase offset for the three channels
|
_counters{2, 1, 0, 0} // create a slight phase offset for the three channels
|
||||||
{}
|
{
|
||||||
|
// The Vic has a 1.6Khz low-pass filter;
|
||||||
|
// TODO: this is part of the Vic-20, not part of the 6560. So relocate it.
|
||||||
|
set_high_frequency_cut_off(1600);
|
||||||
|
}
|
||||||
|
|
||||||
void Speaker::set_volume(uint8_t volume)
|
void Speaker::set_volume(uint8_t volume)
|
||||||
{
|
{
|
||||||
|
@ -72,7 +72,7 @@ template <class T> class MOS6560 {
|
|||||||
|
|
||||||
void set_clock_rate(double clock_rate)
|
void set_clock_rate(double clock_rate)
|
||||||
{
|
{
|
||||||
_speaker->set_input_rate(clock_rate / 4.0);
|
_speaker->set_input_rate((float)(clock_rate / 4.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Outputs::CRT::CRT> get_crt() { return _crt; }
|
std::shared_ptr<Outputs::CRT::CRT> get_crt() { return _crt; }
|
||||||
|
@ -109,12 +109,20 @@ class Speaker {
|
|||||||
*/
|
*/
|
||||||
template <class T> class Filter: public Speaker {
|
template <class T> class Filter: public Speaker {
|
||||||
public:
|
public:
|
||||||
|
Filter() : _high_frequency_cut_off(-1.0) {}
|
||||||
|
|
||||||
|
void set_high_frequency_cut_off(float high_frequency)
|
||||||
|
{
|
||||||
|
_high_frequency_cut_off = high_frequency;
|
||||||
|
set_needs_updated_filter_coefficients();
|
||||||
|
}
|
||||||
|
|
||||||
void run_for_cycles(unsigned int input_cycles)
|
void run_for_cycles(unsigned int input_cycles)
|
||||||
{
|
{
|
||||||
if(_coefficients_are_dirty) update_filter_coefficients();
|
if(_coefficients_are_dirty) update_filter_coefficients();
|
||||||
|
|
||||||
// if input and output rates exactly match, just accumulate results and pass on
|
// if input and output rates exactly match, just accumulate results and pass on
|
||||||
if(_input_cycles_per_second == _output_cycles_per_second)
|
if(_input_cycles_per_second == _output_cycles_per_second && _high_frequency_cut_off < 0.0)
|
||||||
{
|
{
|
||||||
while(input_cycles)
|
while(input_cycles)
|
||||||
{
|
{
|
||||||
@ -196,6 +204,7 @@ template <class T> class Filter: public Speaker {
|
|||||||
|
|
||||||
std::unique_ptr<int16_t> _input_buffer;
|
std::unique_ptr<int16_t> _input_buffer;
|
||||||
int _input_buffer_depth;
|
int _input_buffer_depth;
|
||||||
|
float _high_frequency_cut_off;
|
||||||
|
|
||||||
void update_filter_coefficients()
|
void update_filter_coefficients()
|
||||||
{
|
{
|
||||||
@ -215,7 +224,17 @@ template <class T> class Filter: public Speaker {
|
|||||||
_buffer_in_progress_pointer = 0;
|
_buffer_in_progress_pointer = 0;
|
||||||
|
|
||||||
_stepper.reset(new SignalProcessing::Stepper((uint64_t)_input_cycles_per_second, (uint64_t)_output_cycles_per_second));
|
_stepper.reset(new SignalProcessing::Stepper((uint64_t)_input_cycles_per_second, (uint64_t)_output_cycles_per_second));
|
||||||
_filter.reset(new SignalProcessing::FIRFilter((unsigned int)_number_of_taps, (float)_input_cycles_per_second, 0.0, (float)_output_cycles_per_second / 2.0f, SignalProcessing::FIRFilter::DefaultAttenuation));
|
|
||||||
|
float high_pass_frequency;
|
||||||
|
if(_high_frequency_cut_off > 0.0)
|
||||||
|
{
|
||||||
|
high_pass_frequency = std::min((float)_output_cycles_per_second / 2.0f, _high_frequency_cut_off);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
high_pass_frequency = (float)_output_cycles_per_second / 2.0f;
|
||||||
|
}
|
||||||
|
_filter.reset(new SignalProcessing::FIRFilter((unsigned int)_number_of_taps, (float)_input_cycles_per_second, 0.0, high_pass_frequency, SignalProcessing::FIRFilter::DefaultAttenuation));
|
||||||
|
|
||||||
_input_buffer.reset(new int16_t[_number_of_taps]);
|
_input_buffer.reset(new int16_t[_number_of_taps]);
|
||||||
_input_buffer_depth = 0;
|
_input_buffer_depth = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user