Если бы вы написали программу, которая принимает вход от микрофона, меняет его местами (устанавливает сдвиг по фазе, устанавливая 1 в 0 и 0 в 1), и воспроизводит его из динамиков, может ли это отменить звук? Волновая физика говорит, что если гребни совпадают с впадинами, возникают деструктивные помехи, поэтому их можно использовать здесь для достижения уменьшенного шума, если не устранить его «полностью». Я могу себе представить, что это не сработает из-за усложнения реверса звука или даже из-за того, что обратное воспроизведение и воспроизведение занимает слишком много времени, так что звуковая волна прошла. Если бы мне нужно было связать язык, чтобы сделать это, он должен был быть или c ++, или java (я, по крайней мере, компетентен в обоих).
Да, это отменит звук. Примерно так и работает Surround Sound: вычитая левый / правый каналы, воспроизводя их в 3-м динамике и инвертируя сэмплы, играя из 4-го, вы получаете интересные пространственные эффекты.
Кроме того, вы не просто захотите переключать все биты, вы получите шум; вместо этого вы хотите отрицать.
С небольшим буфером сэмплирования вы будете достаточно быстрыми, чтобы подавлять волны определенных частот. Когда они атакуют и затухают, вы будете отставать, но пока волна сохраняется, вы можете эффективно отменить ее.
С большими буферами выборок, очевидно, задержка увеличивается, так как заполнение буфера образцами занимает больше времени. Размер буфера определяет, как часто происходит прерывание устройства, когда программа копирует входные выборки в выходной буфер, применяя к ним операцию.
Обычно записи производятся с частотой 44,1 кГц, что означает, что много сэмплов в секунду. Если вы установите в буфере 256 сэмплов, вы будете получать уведомления 44100/256 раз в секунду, что нужно обработать 256 сэмплов.
При 256 выборках вы будете отставать от 256/44100 = 0,0058 секунд или 5,8 миллисекунд. Звук распространяется со скоростью около 340 м / с, поэтому звуковая волна переместилась бы на 1,97 метра (340 * 5,8 мс). Эта длина волны соответствует частоте 172 Гц (44100/256). Это означает, что вы можете эффективно подавлять только частоты, которые имеют более низкую частоту, чем частоты, потому что частоты с более высокой частотой «перемещаются» более одного раза в течение 5,8 мс и, таким образом, превышают максимальную «частоту дискретизации», если хотите.
Для 64 выборок частота будет 44100/64 = 689 Гц. И это максимальная частота! Это означает, что вы можете отменить басы и базовую частоту человеческого голоса, но не гармоники.
Типичная ОС имеет тактовую частоту, установленную на 500, 1000 или 2000 Гц, а это означает, что в лучшем случае вы можете использовать буфер сэмплов примерно от двух до трех, что дает максимальную частоту 500, 1000 или 2000 Гц. Телефоны обычно имеют максимальную частоту около 3500 Гц.
Вы можете увеличить частоту системных часов до 32 кГц и напрямую опрашивать АЦП, чтобы достичь таких частот. Тем не менее, вам, вероятно, потребуется припаять один к вашему LPT и запустить собственную ОС, что означает, что о Java не может быть и речи, или использовать встроенную систему реального времени, работающую на Java (см. Комментарий @zapl для ссылки).
Одна вещь, которую я забыл упомянуть, это то, что вам нужно будет учитывать положение источника звука, микрофона и динамика. В идеале все 3 находятся в одном месте, поэтому задержка отсутствует. Но это почти никогда не имеет место, что означает, что вы получите интерференционную картину: в комнате будут пятна, где звук отключен, между точками, где его нет.
Вы не можете сделать это в программном обеспечении, с c ++ или даже в сборке — задержка простого зеркального отображения выходного сигнала на динамиках будет более 6 мс на большинстве компьютеров. Даже если бы у вас была задержка всего 0,1 мс, результирующий звук (при условии, что он идеально микширован) в лучшем случае звучал бы так, как будто он был дискретизирован с частотой 10 кГц (не очень хорошо).