Giter Club home page Giter Club logo

cmm's People

Watchers

 avatar

cmm's Issues

Feature: 2D FFT Needed

Similar requirements to #3 .

There are two primary considered use cases:

  • Remove latent signals from bad instrument cables.
  • Generate downsampled spectrograms that allow you to segment the song based on repeated patterns in the slow time dimension.

Feature: Capability to set high water mark on memory allocator

Presently, the cmm::MemoryManager has an unbounded memory cap (ie: it will grow until it dies of exhaustion).

In real-time applications this is not an issue. In post-processing applications, where there may be a great disparity between a producer and a consumer OR in the case of a very tight CPU loop of non-synchronized GPU operations with temporary allocations... this can become very problematic, very fast.

There should be two modes for the high water mark:

  • If the high water mark is hit, the program should die.
  • If the high water mark is hit, the allocation request should block. It is worth noting that this could cause deadlock in a multi-threaded application.

Feature: `cmm::IPCMemory`

I am not sure yet all that is required here, IPC memory documentation starts here: https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g02bb3632b5d223db6acae5f8744e2c91

I know this is going to require some sort of IPC mechanism, unfortunately C++ does not have a native system semaphore... or a native unnamed pipe.

So, the code needs to be written in a way that abstracts out the OS details from the inter-process socket AND the inter-process semaphore. I do not feel like implementing them all, and I definitely don't want to drag BOOST into this. So, I will only implement the Linux version with a domain socket and a system semaphore.

Feature: 1D FFT Needed

We will end up targeting 10Hz to 80Khz. When discretized to 1Hz increments, that's 80000 * sizeof(double) for the input audio samples. About 0.6 MB. And for the complex type, 1.2 MB. That is doable.

There should be an extensible type_traits class which maps the cuFFT functions to the templated type.

The class should be capable of either taking a 1D signal, or a batch of 1D signals.

For now, it only needs to support:

  • float
  • double

though ideally...

Human perception of sound is logarithmic. As a consequence, most of the solutions (especially in the higher frequencies) in the DFT are completely irrelevant. So it would be nice to find a sparse DFT.

Feature: Inter-thread synchronized communication pipe needed

A "pipe" in this case is simply a (bidirectional or unidirectional) blocking queue with a high-water mark.

The basis for these can be found here:

When you have two threads with independent CUDA streams, sometimes it is desirable to wait stream synchronization on the RECV side of the pipe, sometimes it is desirable to synchronize on the SEND side of the pipe. And sometimes neither is necessary.

The queue needs to be capable of supporting an interface similar to:

enum SyncMode {
  SYNC_NONE,
  SYNC_RECV,
  SYNC_SEND
};

bool
SynchronizedQueue::Push(Type&& data, SyncMode sync_mode);  

Feature: CUBLAS Abstraction Needed

It is not clear what (if any) BLAS functions would benefit audio processing. But for the sake of completeness in the cmm library, I will try to support up to Level 3.

The implementation should be a type_traits class which specializes on the CUDA functions. This should be wrapped in a class capable of deriving most of the argument parameters which would be needed for CUDA by inspecting the matrix types.

Feature: Signal Tone Synthesizer Needed

In order to test anything without dealing with audio parsing, we need the ability to generate a constant tone.

The tone should be parameterized by the following arguments:

  • Frequency
  • Amplitude
  • Time delay

It may also be nice both:

  • Tone series (a series of constant tones changing in slow time)... like a song (discrete tones).
  • Frequency sweep, this is necessary for glissando. It would be nice if the sweep could be parameterized with both a zeroth, first, and second order parameter.

Feature: Complex Type Needed

The complex type is needed for a few reasons:

  • Audio phase coherence is necessary to avoid dead spots in the frequency when mixing two signals, sometimes it is desirable to shift the phase to fix this.
  • Many "Wah" based audio effects require you to modify the imaginary/real component independently. This is obviously needed for phaser sweeps and envelope filters.

This is low priority.

But it would be nice to fully mimic the std::complex type interface.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.