Complete elimination of audio content of 0Hz to 15000Hz

My objective is the complete elimination of audio content in the 0Hz to 15000Hz range using Nyquist, keeping the content above frequency 15000Hz intact. It must be perfect, not like using a High Pass Filter with Cutoff frequency 15000Hz and Rolloff 48dB. I am a beginner in Nyquist, so please explain the code you write in replies. I have the Nyquist Reference Manual Version 3.09.

I have read the following Silent Subliminal related threads in this forum:

Some Additional Questions:
Why did steve and edgar-rft use complicated algorithms to generate Silent Subliminals when it can be produced just by doing what I am trying to accomplish i.e. by completely eliminating audio content in the 0Hz to 15000Hz range? Is Lowry’s method better than what I am trying to accomplish? If yes, why? The result produced using steve’s code doesn’t make the track silent properly. Chirping like sounds can be heard.
I have understood steve’s code because of his crystal clear explanation. I haven’t reviewed edgar-rft’s code yet. It is just a more developed version of steve’s code so the core part is same.

One of the problems with silent subliminals is the inability to test for it. There are clear, pre-packaged tests for creating AudioBook content, for example, but I know of no test for subliminal work.

The other very serious problem is MP3 and other compressed sound formats. They get their small file sizes by deleting inaudible, unperceived content. So if you had subliminal content before the MP3 conversion, you don’t have it after.


Even WAV can have problems. 44100 sample rate WAV content isn’t surgically accurate much above 17000Hz audio. To work beyond that, 44100 depends on tricks and noise, literally, random content. To get perfect accuracy for subliminals requires sampling against a Nyquist value of 2.6, not 2.0. So if someone hands you a subliminal WAV show with 44100 or 48000 sampling, it’s simply not there. The sound channel won’t do it.

The AM thing is even worse. AM requires a sound channel of double the highest sound frequency. Given 7500 sound (AM radio is 5000), that means the content channel has to be 15000 wide. So park a 15000 AM sound channel on top of regular audio 15000 and the top correct, accurate sound frequency needs to be 30000.

96000 WAV sampling (top audio 37000) is required for work like that.

Subsampling (or just bad sampling) will give single-sideband AM distortion (amateur radio quacking or other distortion effects), which loops us back to: No good quality tests available for subliminal content.


Pardon me, you missed the main points of my post.

You need a “brick-wall filter”.
Unfortunately, brick-wall filters only exist in theory. It is not possible to create a “perfect” brick-wall filter, but it is possible to get pretty close, for example:

(dotimes (i 10 *track*)
  (setf *track* (highpass8 *track* 15000)))

According to scientific evidence, neither your method or Lowrey’s method have any provable significant effect (Subliminal stimuli - Wikipedia). If we accept the scientific evidence, then Lowrey’s method is no better than yours.
Of course, “absence of proof” is not “proof of absence”, but “scientific claims” that lack verifiable evidence will always be subject to doubt.

Message for steve:

Your code is very clear and concise.

Some Questions:
Your code works on standard files. What changes do I need to make in this code to apply it on a Mono track which has the attached spectrum? Currently, if I run your code on the mentioned track, nothing happens.
What are the other limitations of the code?
Will the efficiency of the code improve if I increase no. of iterations?
Mono Track Issue.png

What is the sample rate of that track?

22050 Hz

The theoretical absolute maximum frequency possible is half the sample rate (see: Nyquist frequency). In practice, the highest possible frequency is a little less than half the sample rate, so, as can be seen in your posted screenshot, the upper frequency limit of your audio sample is a little under 11025 Hz. It makes no sense to try and filter 22050 Hz sample rate audio above 11025 Hz because not only is there nothing there, it is not possible for there to be anything there.

Higher numbers of iterations increase the attenuation below the filter’s corner frequency (15 kHz in this case), but there is a diminishing return. A few iterations will produce a noticeable increase in the steepness of the filter, but the amount improvement decreases with higher numbers. There is little improvement much above about 8 iterations. Higher numbers of iterations take longer to process, increase the amount of “phase shift”, and filter out an increasing amount of audio above the corner frequency (will remove frequencies that we want to keep). The practical limit is around 10 iterations.