我写了一个程序,它接受 String 并给出它的二进制表示(例如字母" a"到01000001)并发出一个频率表示二进制表示的音调。与给定二进制表示匹配时使用的频率依赖于 TreeMap 。
第二个程序侦听音调,进行一些fft和其他计算以确定它是哪个频率。现在找到相应的频率后,它必须将其转换回二进制(01000001)以格式化为ASCII,从而重新构造字符串。我的问题是,二进制组合及其匹配频率在两个程序使用的 TreeMap 中进行了硬编码。这意味着必须在源文件中写入512对,看起来像
ToneMap() {
// binary representation and the matching frequency
frequency.put("00000000", 400);
frequency.put("00000001", 433);
frequency.put("00000010", 466);
frequency.put("00000011", 499);
frequency.put("00000100", 532);
frequency.put("00000101", 565);
frequency.put("00000110", 598);
frequency.put("00000111", 631);
frequency.put("00001000", 664);
frequency.put("00001001", 697);
frequency.put("00001010", 730);
frequency.put("00001011", 763);
// followed by a lot more
这显然是非常错误和低效的。在两个程序上存储/生成字节/频率对的替代方法是什么,而不必依赖于硬编码的TreeMap。
答案 0 :(得分:0)
在@jontro的帮助下,请参阅评论。
由于已知起始范围和结束范围(400hz和9000hz)。检索到的频率可以与范围一起使用,以找到该频率的索引,从而找到字节表示
// 33 is difference between adjacent frequencies,
// the value of index is 8 which translates to 1000 using
Integer.toBinaryString( (664-400)/33)
//and from the original ToneMap, shows the value obtained from the above code is correct
frequency.put("00001000", 664);